r - 变异和/或总结动态数量的列

标签 r dplyr rlang

在上一个问题中,我想对动态数量的案例执行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))

假设我想对 g2g3g4 列求和。如果我知道这些是列名称,那么这就是简单的标准 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 包)。

过去有 mutatesummarise 的字符串版本(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/

相关文章:

r - R包构建: `:=` can only be used within dynamic dots时出错

r - 根据逗号分割数据框列

r - 如何将参数传递给函数内的 dplyr 连接函数?

重复起始位置增加的序列

mysql - Unknown column in field list报错Rmysql

r - 如何根据该列值中是否存在字符串来替换该列中某些索引处的值(使用 dplyr 并重复而不循环)?

r - 按行 group_by() 和 summarise()

r - dplyr 0.7 等效于已弃用的 mutate_

r - 如何延迟R中函数参数的评估?

rCharts - 将第二个 y 轴添加到时间序列