【发布时间】:2020-06-12 01:53:29
【问题描述】:
例如以下将不起作用:
data(mpg)
filter(mpg, manufacturer =="audi") %>%
sum(.$cty)
但是以下方法会起作用:
data(mpg)
x <- filter(mpg, manufacturer =="audi")
sum(x$cty)
如果可能的话,我想让它全部在管道流中工作。
【问题讨论】:
例如以下将不起作用:
data(mpg)
filter(mpg, manufacturer =="audi") %>%
sum(.$cty)
但是以下方法会起作用:
data(mpg)
x <- filter(mpg, manufacturer =="audi")
sum(x$cty)
如果可能的话,我想让它全部在管道流中工作。
【问题讨论】:
您可以使用pull 将列作为向量,然后使用sum。
library(dplyr)
mpg %>%
filter(manufacturer =="audi") %>%
pull(cty) %>%
sum
#[1] 317
您的尝试不起作用,因为管道将 LHS 的输出作为第一个参数发送到 RHS 中的函数。因此,数据帧作为sum 中的第一个参数传递。如果您在它周围使用{},它将起作用。
filter(mpg, manufacturer =="audi") %>% {sum(.$cty)}
【讨论】:
mpg %>% summarise(sum = sum(cty)),?summarise 的第一个参数是.data,即mpg,它在这里使用管道隐式传递给summarise。使用{} 我们可以阻止这种行为。
我们可以通过在 summarise 本身中执行此操作而无需 filter 步骤来完成此操作
library(dplyr)
library(ggplot2)
mpg %>%
summarise(out = sum(cty[manufacturer == "audi"])) %>%
pull(out)
#[1] 317
【讨论】: