繁体   English   中英

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

[英]Paste element of a vector into dplyr function

我有以下数据集:

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从中读取相应的变量并将其粘贴到汇总函数中:

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])) ="

如何在此汇总函数中粘贴向量的值以使其起作用?

要在左侧定义一个新变量,您需要:=而不是= 因为您使用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 包(v1.0.0) 创建于 2022-12-21

这是一个通过 base 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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM