gpt4 book ai didi

r - 使用 dplyr 函数进行管道化时使用方括号进行子集化

转载 作者:行者123 更新时间:2023-12-05 05:09:54 24 4
gpt4 key购买 nike

虽然我有一个(有点复杂的)解决方法,但我试图弄清楚为什么当管道从 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"] 没有?

最佳答案

回答您的问题: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"

关于r - 使用 dplyr 函数进行管道化时使用方括号进行子集化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57119689/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com