如何对R语言data.frame中连续相同group的value求和?
对连续相同分组的数值求和
原始数据生成
首先用以下R代码生成目标数据框:
set.seed(123) df <- data.frame(group = sample(c("a", "b", "c"), 20, replace = TRUE), value = round(runif(20)*10))
生成的原始数据如下:
group value 1 c 10 2 c 7 3 c 7 4 b 5 5 c 6 6 b 3 7 b 1 8 b 10 9 c 9 10 a 7 11 b 8 12 b 0 13 a 5 14 b 8 15 c 2 16 a 3 17 c 2 18 c 1 19 a 4 20 a 4
需求说明
需要对**连续相同group**对应的value进行求和,最终得到如下结果:
group values 1 c 24 2 b 5 3 c 6 4 b 14 5 c 9 6 a 7 7 b 8 8 a 5 9 b 8 10 c 2 11 a 3 12 c 3 13 a 8
解决方案
核心思路是先为连续相同的group生成唯一分组标识,再按该标识分组求和,以下提供两种实现方式:
方式1:Base R实现
# 生成连续分组标识:当前行group与上一行不同时,计数递增 df$group_id <- cumsum(c(TRUE, df$group[-1] != df$group[-nrow(df)])) # 按分组标识和group聚合求和 result <- aggregate(value ~ group + group_id, df, sum) # 整理结果格式 result <- result[, c("group", "value")] colnames(result) <- c("group", "values") print(result)
方式2:dplyr包实现
如果熟悉tidyverse生态,可使用更简洁的管道式代码:
library(dplyr) result <- df %>% # 生成连续分组标识,处理首行无前置行的情况 mutate(group_id = cumsum(group != lag(group, default = first(group)))) %>% # 按分组标识和group求和 group_by(group_id, group) %>% summarise(values = sum(value), .groups = "drop") %>% # 移除辅助的group_id列 select(group, values) print(result)
两种方式都能精准识别连续相同的group并完成求和,最终输出与预期一致。
内容的提问来源于stack exchange,提问作者Zoe
相关产品推荐
相关产品推荐

