【发布时间】:2020-12-20 05:44:32
【问题描述】:
在上一个问题中,我想以动态数量的案例执行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 方法)?
【问题讨论】: