【问题标题】:Subsetting with square brackets while piping with dplyr functions使用 dplyr 函数进行管道时使用方括号进行子集化
【发布时间】: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 %&gt;% filter(qsec == 16.46)[,"gear"] 没有?

【问题讨论】:

  • pullmtcars %&gt;% filter(qsec == 16.46) %&gt;% pull(qsec)mtcars %&gt;% filter(qsec == 16.46) %&gt;% .[, "qsec"] [1] 16.46
  • 或者将其包含在() (mtcars %&gt;% filter(qsec == 16.46))[, "qsec"]# [1] 16.46 中,否则,它将查找运算符优先级(检查?Syntax
  • 这项工作:mtcars %&gt;% { filter(., qsec == 16.46)[, "gear"] }
  • 在 dplyr 管道中,您可以使用:mtcars %>% filter(qsec == 16.46) %>% .[,"gear"]
  • 太棒了,谢谢大家!我知道必须有一些我忽略的东西。我特别喜欢%&gt;% .[,"gear"] 选项。我现在有一些代码要清理。

标签: r dplyr pipe subset


【解决方案1】:

回答您的问题:magritte 管道将左侧 (lhs) 作为右侧函数中的第一个参数。您可以通过使用花括号来抑制这种行为,如 cmets 中的 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"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-26
    • 2016-12-25
    • 1970-01-01
    • 2021-10-13
    相关资源
    最近更新 更多