这里的一位无私成员帮助我编写了以下代码,以使用 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.
我在这里错过了什么?提前致谢。
答案 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))