在上一个问题中,我想对动态数量的案例执行case_when
。解决方案是使用 parse_exprs
和 !!!
。我正在寻找类似的解决方案来使用动态列数进行变异/汇总。
考虑以下数据集。
library(dplyr)
library(rlang)
data(mtcars)
mtcars = mtcars %>%
mutate(g2 = ifelse(gear == 2, 1, 0),
g3 = ifelse(gear == 3, 1, 0),
g4 = ifelse(gear == 4, 1, 0))
假设我想对 g2
、g3
、g4
列求和。如果我知道这些是列名称,那么这就是简单的标准 dplyr:
answer = mtcars %>%
summarise(sum_g2 = sum(g2),
sum_g3 = sum(g3),
sum_g4 = sum(g4))
但是假设我不知道有多少列,或者它们的确切名称。相反,我有一个包含我关心的所有列名称的向量。按照我之前方法中接受的答案中的逻辑,我将使用:
columns_to_sum = c("g2","g3","g4")
formulas = paste0("sum_",columns_to_sum," = sum(",columns_to_sum,")")
answer = mtcars %>%
summarise(!!!parse_exprs(formulas))
如果这确实有效,那么无论 columns_to_sum
中作为输入提供的列名称如何,我都应该收到相应列的总和。然而,这是行不通的。我得到的不是包含 sum(g2)
的名为 sum_g2
的列,而是名为 "sum_g2 = sum(g2)"
的列以及其中的每个值列为零。
鉴于我可以将公式传递到 case_when
中,似乎我应该能够将公式传递到 summarise
中(同样的想法也应该适用于 mutate
因为它们都使用了 rlang 包)。
过去有 mutate
和 summarise
的字符串版本(mutate_
和 summarise_
),您可以将公式作为字符串传递。但这些已经被淘汰,因为 rlang 方法是现在的预期方法。我在 Stackoverflow 上查看的相关问题没有使用 rlang 引用方法,因此不足以满足我的目的。
如何使用动态数量的列进行汇总(使用 rlang 方法)?
最佳答案
自dplyr 1.0.0
以来的一个选项可能是:
mtcars %>%
summarise(across(all_of(columns_to_sum), sum, .names = "sum_{col}"))
sum_g2 sum_g3 sum_g4
1 0 15 12
关于r - 变异和/或总结动态数量的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63682091/