R语言按条件聚合行并保留非分组id1列的实现方案
实现方案
你可以在原有dplyr语法的基础上调整分组后的过滤逻辑,直接兼容你现有的代码风格:
library(dplyr) df <- df %>% group_by(id2) %>% # 仅对id2为a的组保留前2行,其余组保留全部行 filter(if (first(id2) == "a") row_number() <= 2 else TRUE) %>% summarise( id1 = first(id1), # 取组内第一个id1值,和你期望的输出一致 across(starts_with("n"), sum, na.rm = TRUE), .groups = "drop" )
运行后输出结果完全匹配你的需求:
id1 id2 n1 n2 n3 n4 <chr> <chr> <dbl> <dbl> <dbl> <dbl> 1 a a 4 3 1 1 2 c d 0 1 1 1
补充说明
- 把
filter替换为slice(if (first(id2) == "a") 1:2 else everything())可以实现完全相同的效果 - 用
starts_with("n")匹配所有n开头的列,不需要手动枚举所有n列,后续新增n前缀列时无需修改代码 - 如果id2为a的组实际行数不足2行,代码会自动按实际存在的行数聚合,无需额外兼容处理
内容的提问来源于stack exchange,提问作者Anh
相关产品推荐
相关产品推荐

