为何Groupby与Filter的不同组合会产生不同输出结果?
两段R分组筛选代码的输出差异解析
示例数据
df <- data.frame(ID = c(1,1,3,4,5,6,6), Acronym = c('A','B','A','A','B','A','A') )
第一段代码逻辑与输出
df %>% group_by(ID) %>% filter(Acronym == 'A', n() > 1)
- 执行逻辑:
- 先按
ID完成分组:每个ID对应的所有原始行构成一个分组,比如ID=1的分组包含2行(A、B),ID=6的分组包含2行(A、A),其余ID各对应1行。 - 筛选条件是同时作用于分组和行:
n()计算的是整个原始分组的总行数,而非筛选后的行数;只要原始分组总行数>1,且当前行的Acronym为'A',该行就会被保留。
- 最终输出:ID=1的'A'行、ID=6的两行'A'记录。
- 先按
第二段代码逻辑与输出
df %>% filter(Acronym == 'A') %>% group_by(ID) %>% filter(n() > 1)
- 执行逻辑:
- 先全局筛选出所有
Acronym == 'A'的行,得到的数据集包含ID=1(A)、ID=3(A)、ID=4(A)、ID=6(A,A)这几行。 - 再按
ID分组:此时每个分组是筛选后该ID对应的所有行,比如ID=1的分组仅1行,ID=6的分组有2行。 - 筛选
n() > 1:这里的n()是筛选后分组的行数,只有行数>1的分组会被保留,最终仅输出ID=6的两行'A'记录。
- 先全局筛选出所有
核心差异
两段代码的本质区别在于**n()的计算时机和对象不同**:
- 第一段中,
n()针对的是未筛选Acronym的原始分组总行数,只要原始分组行数>1,且行满足'A'就保留。 - 第二段中,
n()针对的是先筛选'A'后形成的分组行数,只有筛选后分组行数>1的才会被保留。
内容的提问来源于stack exchange,提问作者Dre Day
相关产品推荐
相关产品推荐

