使用" []"对tibble进行子集化给出"未找到的对象"错误

时间:2017-06-05 16:19:45

标签: r dplyr

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

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

但是我找到了一个未找到的对象"错误。 以下是在更知名的数据集" iris"

上复制错误
library(dplyr)
iris %>% filter(Sepal.Length>6) [,c(1:3)]
  

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

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

2 个答案:

答案 0 :(得分:2)

你需要一个额外的管道:

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

抱歉,忘了括号前的.

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

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

答案 1 :(得分: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,这是[的“可管道”版本:

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

您引用的博客条目在dplyr时间过去了 - 大约3岁。 dplyr已发生很大变化。我不知道博客的建议是否在编写时起作用,但我建议您找一些更新的资料来了解这个经常变化的软件包。