首页 文章

使用“[]”对tibble进行子集会给出“找不到对象”错误

提问于
浏览
2

关于dplyr here的文章说"[]"(方括号)可用于对过滤后的Tibbles进行子集化,如下所示:

filter(mammals, adult_body_mass_g > 1e7)[ , 3]

但我得到一个“找不到对象”的错误 . 这是在更知名的数据集“iris”上复制错误

library(dplyr)
iris %>% filter(Sepal.Length>6) [,c(1:3)]

过滤器_( . data,.dots = lazyeval :: lazy_dots(...))出错:找不到对象'Sepal.Length'

我还想提一下,我故意不想使用 select() 在dplyr中使用本机子集,因为我需要一个向量输出而不是单个列上的数据帧 . 不幸的是,dplyr总是强制数据帧输出(出于好的理由) .

2 回答

  • 2

    dplyr 这样做的方法是使用 select

    iris %>% filter(Sepal.Length > 6) %>% select(1:3)
    

    您也可以使用 {} ,以便在应用 [ 之前完成过滤:

    {iris %>% filter(Sepal.Length>6)}[,c(1:3)]
    

    或者,如另一个答案所示,使用 . 表示法指示数据应该与 [ 相关的位置:

    iris %>% filter(Sepal.Length>6) %>% .[,1:3]
    

    您还可以显式加载 magrittr 并使用 extract ,这是 [ 的"pipe-able"版本:

    library(magrittr)
    iris %>% filter(Sepal.Length>6) %>% extract( ,1:3)
    

    您引用的博客条目在 dplyr 时间过了 - 大约3岁 . dplyr 已经发生了很大的变化 . 我建议在撰写或不写作时提出建议,但我建议找一些更新的资料来了解这个经常变化的资料包 .

  • 2

    你需要一个额外的管道:

    iris %>% filter(Sepal.Length>6) %>% .[,1:3]
    

    对不起,忘了括号前的 . .

    注意:如果您坚持使用tidyverse语法并使用select作为最后一个操作,那么您的代码可能会更具可读性 .

    iris %>%
         filter(Sepal.Length > 6) %>%
         select(1:3)
    

相关问题