将向量元素粘贴到dplyr函数中

jv4diomz  于 2022-12-25  发布在  其他
关注(0)|答案(3)|浏览(108)

我有以下数据集:

df_x <- data.frame(year = c(2000, 2000, 2000, 2001, 2001, 2001, 2002, 2002, 2002),
             a = c(7, 3, 5),
             b = c(5, 8, 1),
             c = c(8, 4, 3))

这个向量

v <- c("a", "b", "c")

现在,我想创建一个新的数据集,并通过创建新变量(y_ay_by_c)来汇总a、b和c,这些变量计算按年份分组的每个变量的平均值。
执行此操作的代码如下所示:

y <- df_x %>% group_by(year) %>%  dplyr::summarise(y_a = mean(a, na.rm = TRUE),
                y_b = mean(b, na.rm = TRUE),
                y_c = mean(c, na.rm = TRUE))

但是,我想使用向量v从其中读取相应的变量并粘贴到summarise函数中:

y <- df_x %>% group_by(year) %>%  dplyr::summarise(as.name(paste0("y_", v[1])) = mean(as.name(v[1]), na.rm = TRUE),
                                                   as.name(paste0("y_", v[2])) = mean(as.name(v[1]), na.rm = TRUE),
                                                   as.name(paste0("y_", v[3])) = mean(as.name(v[1]), na.rm = TRUE))

执行此操作时,我收到以下错误消息:

Error: unexpected '=' in "y <- df_x %>% group_by(year) %>%  dplyr::summarise(as.name(paste0("y_", v[1])) ="

如何在summarise函数中粘贴一个向量的值以使其工作?

daolsyd0

daolsyd01#

要在左手定义新变量,您需要:=而不是=。因为使用paste0创建它,所以需要!!来注入表达式并确保正确计算。要使用存储在变量中的字符串访问dplyr中的现有列,使用.data是最简单的方法。

library(dplyr)

df_x <- data.frame(year = c(2000, 2000, 2000, 2001, 2001, 2001, 2002, 2002, 2002),
                   a = c(7, 3, 5),
                   b = c(5, 8, 1),
                   c = c(8, 4, 3))

v <- c("a", "b", "c")

df_x %>% group_by(year) %>% 
  dplyr::summarise(!!paste0("y_", v[1]) := mean(.data[[v[1]]], na.rm = TRUE),
                   !!paste0("y_", v[2]) := mean(.data[[v[1]]], na.rm = TRUE),
                   !!paste0("y_", v[3]) := mean(.data[[v[1]]], na.rm = TRUE))
#> # A tibble: 3 × 4
#>    year   y_a   y_b   y_c
#>   <dbl> <dbl> <dbl> <dbl>
#> 1  2000     5     5     5
#> 2  2001     5     5     5
#> 3  2002     5     5     5

reprex package(v1.0.0)于2022年12月21日创建

6ju8rftf

6ju8rftf2#

这是一个单线过孔基底R,

aggregate(. ~ year, cbind.data.frame(year = df_x$year, df_x[v]), FUN = \(i)mean(i, na.rm = TRUE))

  year a        b c
1 2000 5 4.666667 5
2 2001 5 4.666667 5
3 2002 5 4.666667 5
cunj1qz1

cunj1qz13#

使用across并使用.names修改名称会更容易

library(dplyr)
df_x %>% 
 group_by(year) %>% 
 summarise(across(all_of(v), ~ mean(.x, na.rm = TRUE), .names = "y_{.col}"))
  • 输出
# A tibble: 3 × 4
   year   y_a   y_b   y_c
  <dbl> <dbl> <dbl> <dbl>
1  2000     5  4.67     5
2  2001     5  4.67     5
3  2002     5  4.67     5

相关问题