r - 如何在 R 中使用带空参数的 group_by()?

标签 r tidyverse tidyr

我正在编写一个函数,根据某些分组(g1 和 g2)计算变量的平均值。我希望该函数能够处理用户只想计算各组平均值的情况,因此组参数将为空。 我想要一个使用 tidyverse 的解决方案。

假设如下:

y = 1:4
g1 = c('a', 'a', 'b', 'b')
g2 = c(1,2,1,2)
MyData = data.frame(g1, g2, y)

MyFun = function(group){
  group_sym = syms(group)
  MyData %>% 
    group_by(!!!group_sym) %>% 
    summarise(mean = mean(y))
}

# this works well
MyFun(group = c('g1', 'g2'))

现在假设我想要 y 在所有组中的平均值。我希望该功能能够处理类似的事情

MyFun(group = '')

MyFun(group = NULL)

所以理想情况下,我希望 group 参数为空/null,因此 MyData 不会被分组。一种解决方案是在函数的开头添加一个条件,检查参数是否为空,如果为真,则在不使用 group_by 的情况下编写总结。但这并不优雅,我的真实代码远不止几行。

有什么想法吗?

最佳答案

1) 使用 {{...}} 并使用 g1 代替 'g1' :

MyFun = function(group) {
  MyData %>% 
    group_by({{group}}) %>% 
    summarise(mean = mean(y)) %>%
    ungroup
}

MyFun(g1)
## # A tibble: 2 x 2
##   g1     mean
##   <fct> <dbl>
## 1 a       1.5
## 2 b       3.5

MyFun()
## # A tibble: 1 x 1
##    mean
##   <dbl>
## 1   2.5

2) 这种方法在问题中使用 'g1'

MyFun = function(group) {
  group <- if (missing(group)) 'All' else sym(group)
  MyData %>% 
    group_by(!!group) %>% 
    summarise(mean = mean(y)) %>%
    ungroup
}

MyFun('g1')
## # A tibble: 2 x 2
##   g1     mean
##   <fct> <dbl>
## 1 a       1.5
## 2 b       3.5

MyFun()
##  # A tibble: 1 x 2
##   `"All"`  mean
##   <chr>   <dbl>
## 1 All       2.5

3) 这也有效并给出与 (2) 相同的输出。

MyFun = function(...) {
  group <- if (...length()) syms(...) else 'All'
  MyData %>% 
    group_by(!!!group) %>% 
    summarise(mean = mean(y)) %>%
    ungroup
}
MyFun('g1')
MyFun()

关于r - 如何在 R 中使用带空参数的 group_by()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59374820/

相关文章:

r - tidyr::gather na.rm 缺少数据

r - bnlearn 的并行化(使用并行包)

r - 成功构造 LME4 GLMM 时有所不同 |试验与原始数据?

r - 如何从 tibble 中删除非缺失值与其他行中的值子集匹配的行?

r - 不规则时间序列与 R 的插值

r - 变量 R 之间的转换

python - Emacs 缩进不识别 Python 模式中的变量

r - 用正确的组号标记 R 树状图分支

r - 在具有向量值参数的非标准评估的函数中使用 `facet_wrap`

r - tidyr::pivot_longer() 函数不适用于将列从逻辑转换为整数的 tibble