虽然我有一个(有些费解的)变通办法,但我试图弄清楚为什么在使用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"]
不会吗?
答案 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"]