dplyr中同一行双变量分组与分两行分组的差异解析
问题
我需要获取数据集中狗名(animals_name)与犬种(primary_breed)的所有组合及其出现次数。操作时发现两种分组方式结果差异明显:
- 直接在同一行用
group_by(animals_name, primary_breed)分组,能得到「狗名+犬种」组合的对应计数(通常是1或2); - 先执行
group_by(animals_name)再执行group_by(primary_breed),得到的却是该犬种的总计数,而非组合计数。
测试代码如下:
seattle_dogs %>% #group_by(animals_name) %>% #mutate(name_total = n()) %>% group_by(animals_name, primary_breed) %>% mutate(name_total = n()) %>% ungroup() %>% group_by(animals_name) %>% group_by(primary_breed) %>% mutate(name_total2 = n()) %>% ungroup()
结果里相同犬种对应的name_total2值完全一致,想知道这是为什么?
原因说明
核心原因是dplyr里连续调用group_by()是覆盖分组,不是叠加分组:
- 同一行写
group_by(animals_name, primary_breed),是同时按两个字段创建分组,每个分组都是「狗名+犬种」的唯一组合,所以n()算的是每个组合的行数,也就是你要的组合出现次数。 - 先
group_by(animals_name)再group_by(primary_breed),第二次调用会直接替换掉第一次的分组规则,最终只会按primary_breed单个字段分组,n()自然就成了整个犬种的总行数,和狗名没关系了。
如果想实现叠加分组(同时保留两个字段的分组),得用.add = TRUE参数,代码改成这样就行:
seattle_dogs %>% group_by(animals_name) %>% group_by(primary_breed, .add = TRUE) %>% mutate(name_total2 = n()) %>% ungroup()
这样就会同时按狗名和犬种分组,得到的就是你要的组合计数了。
内容的提问来源于stack exchange,提问作者1989-a-number
相关产品推荐
相关产品推荐

