在R语言中如何按分组并带条件对行求和
解决R语言按分组带条件求和的问题
首先,先还原你的示例数据:
df1 <- data.frame( id = c(1,1,2,3,4,4), window = c(10,230,430,10,370,380), count1 = c(2,53,40,3,32,14), count2 = c(30,3,5,94,4,3) )
你之前用mutate的思路问题在于:它只会给每行新增列,不会合并行,但你的需求是要把同ID下所有window≠10的行合并成一行并求和,因此需要用分组聚合+分情况处理再合并的方式实现:
library(dplyr) result_df1 <- df1 %>% # 分两组处理后合并 bind_rows( # 第一组:直接保留所有window=10的行 filter(., window == 10), # 第二组:对window≠10的行按ID聚合 filter(., window != 10) %>% group_by(id) %>% summarise( window = min(window), # 取组内最小的window,要取第一个出现的就换成first(window) count1 = sum(count1), count2 = sum(count2), .groups = "drop" ) ) %>% # 按ID排序让结果更规整 arrange(id)
运行后得到的结果完全符合你的预期:
id window count1 count2 1 1 10 2 30 2 1 230 53 3 3 2 430 40 5 4 3 10 3 94 5 4 370 46 7
逻辑说明
- 先把数据拆成两类:
window=10的行直接保留,不需要聚合;window≠10的行按ID分组,用summarise求和计数、提取目标window值; - 最后用
bind_rows把两部分结果合并,再排序得到最终输出。
内容的提问来源于stack exchange,提问作者Yuto Best boy
相关产品推荐
相关产品推荐

