You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()是覆盖分组,不是叠加分组:

  1. 同一行写group_by(animals_name, primary_breed),是同时按两个字段创建分组,每个分组都是「狗名+犬种」的唯一组合,所以n()算的是每个组合的行数,也就是你要的组合出现次数。
  2. 先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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 20:42:10