将 dplyr::summarize 与 seq_along 一起使用时出错

时间:2021-02-21 03:18:23

标签: r for-loop dplyr rlang summarize

这里的一位无私成员帮助我编写了以下代码,以使用 for 循环和 dplyr::summarize 生成变量。正如预期的那样,此代码运行良好。

library(nycflights13)

flights <- nycflights13::flights %>%
  select(carrier,distance,hour)

by_carrier <- NULL
for ( i in c("distance", "hour") {   
  df <- 
    flights %>%
    dplyr::group_by(carrier) %>%
    dplyr::summarize(!!as.name(i) := sum(!!as.name(i) ))
  by_carrier <- bind_cols(by_carrier,df)
}

但是当我按照以下方式更改 for 循环参数时,它遇到错误:

var_interest <- c("distance", "hour")

by_carrier <- NULL

for ( i in seq_along(var_interest)) {   
  df <- 
    flights %>%
    dplyr::group_by(carrier) %>%
    dplyr::summarize(!!as.name(i) := sum(!!as.name(i) ))
  by_carrier <- bind_cols(by_carrier,df)
}

错误如下:

Error: Problem with `summarise()` input `1`.
x object '1' not found
i Input `1` is `sum(`1`)`.
i The error occurred in group 1: carrier = "9E".
Run `rlang::last_error()` to see where the error occurred.

我在这里错过了什么?提前致谢。

1 个答案:

答案 0 :(得分:2)

由于您使用的是 seq_along,因此 i 是 1、2,它们不是数据中列的名称。将 for 循环更改为 for (i in var_interest) 或在循环内使用 var_interest[i]

library(dplyr)

by_carrier <- NULL

var_interest <- c("distance", "hour")
for (i in var_interest) {   
  df <- 
    flights %>%
    dplyr::group_by(carrier) %>%
    dplyr::summarize(!!as.name(i) := sum(!!as.name(i) ))
  by_carrier <- bind_cols(by_carrier,df)
}

也许更好的选择是使用 across 而不是循环。

flights %>%
  group_by(carrier) %>%
  summarise(across(all_of(var_interest), sum))