You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言如何按id分组逐年统计独有事件的累计总和

R按ID分组计算累计独有事件数

原始数据结构

id <- c("1", "1", "1", "1", "1", "1", "2", "2", "2", "3")
year <- c(1900,1900,1900,1901,1902,1902,1900,1901,1901,1900)
event <- c('A','B','C','A','D','E','A','B','C','A')
df <- data.frame(id, year, event)

原始数据预览:

idyearevent
11900A
11900B
11900C
11901A
11902D
11902E
21900A
21901B
21901C
31900A

统计需求

输出每个(id, year)组合对应的累计独有事件数:即统计到当前年份为止,该id下出现过的所有不同事件的总数量,预期输出如下:

idyearcum_sum
119003
119013
119025
219001
219013
319001

实现代码

方法1:使用tidyverse套件(推荐)

library(tidyverse)

result <- df %>%
  # 保证同ID下按年份升序排列
  arrange(id, year) %>%
  group_by(id) %>%
  # 累计记录所有出现过的不重复事件
  mutate(unique_events = accumulate(event, ~ union(.x, .y)),
         # 计算当前累计不重复事件数量
         cum_sum = map_int(unique_events, length)) %>%
  # 按ID和年份聚合,取每年对应的累计值
  group_by(id, year) %>%
  summarise(cum_sum = max(cum_sum), .groups = "drop")

方法2:基础R实现

# 按ID拆分数据
df_split <- split(df, df$id)
result <- do.call(rbind, lapply(df_split, function(sub_df) {
  # 按年份排序
  sub_df <- sub_df[order(sub_df$year), ]
  seen <- c()
  # 逐年统计累计唯一值
  agg <- aggregate(event ~ year, sub_df, function(x) {
    seen <<- unique(c(seen, x))
    length(seen)
  })
  agg$id <- unique(sub_df$id)
  agg[, c("id", "year", "event")]
}))
rownames(result) <- NULL
colnames(result)[3] <- "cum_sum"

两种方法运行后得到的result均和预期输出一致。


内容的提问来源于stack exchange,提问作者JuM24

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 05:54:02