【发布时间】:2019-07-19 21:18:27
【问题描述】:
虽然我有一个(有些复杂的)解决方法,但我试图弄清楚为什么当管道来自 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"] 没有?
【问题讨论】:
-
有
pullmtcars %>% filter(qsec == 16.46) %>% pull(qsec)或mtcars %>% filter(qsec == 16.46) %>% .[, "qsec"] [1] 16.46 -
或者将其包含在
()(mtcars %>% filter(qsec == 16.46))[, "qsec"]# [1] 16.46中,否则,它将查找运算符优先级(检查?Syntax) -
这项工作:
mtcars %>% { filter(., qsec == 16.46)[, "gear"] } -
在 dplyr 管道中,您可以使用:mtcars %>% filter(qsec == 16.46) %>% .[,"gear"]
-
太棒了,谢谢大家!我知道必须有一些我忽略的东西。我特别喜欢
%>% .[,"gear"]选项。我现在有一些代码要清理。