r - 使用 dplyr : indirectly control by which variables to group by 编程

标签 r dplyr evaluation

我想编写一个简单的函数 f(grouping) 来汇总以下数据:

d0 <- data.frame(
  V1 = rep(1:5, times = 2),
  V2 = rep(2:6, times = 2),
  V3 = rep(11:15, times = 2),
  V4 = rep(12:16, times = 2),
  X = 1:10
)

我希望用户能够在两种分组之间进行选择:通过 V1 或通过 V2,因为用户可以编写 f( grouping = V1)f(grouping = V2)。但是,我希望它是这样的,如果 grouping = V1,它按 V1V3 分组。如果 grouping = V2,则它按 V2V4 分组。请注意,由于 V3V4 最初的名称不直观,因此不应将它们用作函数调用的参数。

f(V1) 应该产生:

 # A tibble: 5 x 3
# Groups:   V1 [5]
     V1    V3     X
  <int> <int> <int>
1     1    11     7
2     2    12     9
3     3    13    11
4     4    14    13
5     5    15    15

f(V2):

# A tibble: 5 x 3
# Groups:   V2 [5]
     V2    V4     X
  <int> <int> <int>
1     2    12     7
2     3    13     9
3     4    14    11
4     5    15    13
5     6    16    15

最佳答案

我们使用 if/else 创建一个条件,以根据输入 grouping 的值连接“V3”或“V4”。在函数内部,将不带引号的分组值转为符号(ensym),再转为字符串(as_string),再用if/else连接组,在 across 中传递更新的组 ('grp') 并 summarise 'X'

f1 <- function(data, grouping) {
        grp <- rlang::as_string(ensym(grouping))
        grp <- c(grp, if(grp == 'V1') 'V3' else 'V4')

        data %>%
            group_by(across(all_of(grp))) %>%
            summarise(X = sum(X), .groups = 'drop')

}

f1(d0, V1)
f1(d0, V2)

关于r - 使用 dplyr : indirectly control by which variables to group by 编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65726665/

相关文章:

r - 使用 R 中的另一个函数停止函数评估

C++、海湾合作委员会 : avoid evaluation of useless expressions

R 将字符串评估为数据框

r - 如何使用 R 抓取点击信息?

r - 如何在 r 的函数定义中正确使用 dplyr 动词?

r - 如何通过将行组合成列表来折叠小标题?

python - 如何在完整验证示例上评估 Tensorflow 模型

r - 如何使用 ggplot2 制作基本的 R 风格箱线图?

r - stringi R 忽略重音特殊字符来匹配

r - 剪切列并将其与 r 中的数据框进行 rbind