如何在函数中使用dplyr::group_by实现多变量分组统计
多分组变量的统计计数函数实现
你现在的问题是想让countString函数支持传入多个分组变量,同时保留原变量列而不是合并成一列对吧?我来帮你调整一下代码,完美解决这个需求~
问题分析
你原来的函数用了enquo(),它只能处理单个变量,所以传入多个变量或者用paste()合并都会导致列被合并。要支持多个分组变量,我们需要用...(可变参数)配合enquos()来捕获多个变量。
解决方案代码
修改后的函数可以这样写:
library(dplyr) # 先创建你的示例数据 l <- c("a", "b", "c", "e", "f", "g") animal <- c("dog", "cat", "dog", "dog", "cat", "fish") sex <- c("m", "f", "f", "m", "f", "unknown") n <- rep(1, length(animal)) theTibble <- tibble(l, animal, sex, n) # 支持多分组变量的计数函数 countString <- function(...) { theTibble %>% group_by(!!! enquos(...)) %>% count(name = "nn") # 指定计数列名为nn,匹配你期望的结果格式 }
使用示例
- 单变量分组:
countString(animal)
输出会保留animal列和计数列nn。
- 多变量分组(这就是你想要的效果):
countString(animal, sex)
运行后得到的结果和你期望的完全一致:
# A tibble: 4 x 3 # Groups: animal, sex [4] animal sex nn <chr> <chr> <int> 1 cat f 2 2 dog f 1 3 dog m 2 4 fish unknown 1
关键知识点说明
...:用来接收任意数量的分组变量参数,让函数更灵活。enquos(...):把传入的多个变量转换成带环境信息的变量引用(quosures),方便dplyr识别。!!!:解引用运算符,把quosures列表展开成group_by()能识别的多个独立参数,这样就能保留每个分组变量的原始列了。
这样修改后,你的函数既支持单变量分组,也支持多变量分组,完全满足需求~
内容的提问来源于stack exchange,提问作者itsMeInMiami
相关产品推荐
相关产品推荐

