使用dplyr功能进行配管时使用方括号进行子集化

时间:2019-07-19 21:18:27

标签: r dplyr pipe subset

虽然我有一个(有些费解的)变通办法,但我试图弄清楚为什么在使用dplyr函数进行管道传递时,使用方括号([])进行子设置的效果不相同。

一个非常简单的演示。前两个工作:

library(dplyr)

my_data <- mtcars %>% 
  filter(qsec == 16.46)
my_data[,"gear"]
#[1] 4

filter(mtcars, qsec == 16.46)[,"gear"]
#[1] 4

但是,以下操作失败:

mtcars %>% filter(qsec == 16.46)[,"gear"]

#Error in filter(qsec == 16.46) : object 'qsec' not found

我似乎找不到任何可以使该符号起作用的东西。我可以通过执行以下操作来解决它:

mtcars %>% 
  filter(qsec == 16.46) %>% 
  select(gear) %>% 
  as.numeric()
#[1] 4

mtcars %>% 
  filter(qsec == 16.46) %>% 
  subset(subset = TRUE, select = "gear") %>% 
  as.numeric()
#[1] 4

但这至少增加了两个管道函数(取决于您需要子集的内容),并且似乎方括号表示法应该有效,但至少在我期望的方式。

关于filter(mtcars, qsec == 16.46)[,"gear"]为何有效的任何见解, 但是mtcars %>% filter(qsec == 16.46)[,"gear"]不会吗?

2 个答案:

答案 0 :(得分:1)

回答您的问题:magritte管道将左侧(lhs)作为右侧函数中的第一个参数。您可以通过使用大括号(如注释中的G. Grothendieck所示)来抑制此行为。如果您不输入lhs,则会将其输入子集函数[],这会导致上述错误。

您可以使用粘贴功能来玩耍。下面的示例来自magrittr文档。

sample(1:5) %>% paste0(LETTERS[.])
> [1] "4D" "2B" "5E" "3C" "1A"

sample(1:5) %>% {paste0(LETTERS[.])}
> [1] "D" "B" "E" "A" "C"

答案 1 :(得分:0)

我们可以使用()

(mtcars %>%
        filter(qsec == 16.46))[, "qsec"]