如何仅对重复2次的ID分组汇总DataFrame?重复超2次不汇总
解决方法
报错原因
你使用的summarize_if()第一个参数是用来筛选列的逻辑条件(比如is.numeric),而非判断分组行数的条件,n()在这里无法识别分组上下文,因此抛出错误。另外summarize_if()已被dplyr弃用,推荐使用across()替代。
方案1:仅保留行数=2的分组的汇总结果
先筛选出刚好有2行的ID分组,再对这些分组执行汇总:
library(dplyr) df %>% group_by(ID) %>% filter(n() == 2) %>% # 只保留行数为2的分组 summarize(across(everything(), first)) # 对所有列取第一个值完成汇总
方案2:行数=2的分组做汇总,其他分组保留原行
如果需要保留行数≠2的分组的所有原始行,同时对行数=2的分组做汇总,用group_modify()逐个处理分组:
df %>% group_by(ID) %>% group_modify(function(group_data, group_info) { if (nrow(group_data) == 2) { # 行数为2时取第一行作为汇总结果 group_data %>% slice(1) } else { # 行数≠2时保留原行 group_data } }) %>% ungroup()
补充说明
- 如果你的汇总需求不是取
first(),而是求和、均值等其他操作,直接替换first()为对应函数即可。 across(everything(), ...)会对所有列应用指定函数,你也可以通过across(c(col1, col2), ...)指定特定列进行汇总。
内容的提问来源于stack exchange,提问作者Maya Eldar
相关产品推荐
相关产品推荐

