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)
原始数据预览:
| id | year | event |
|---|---|---|
| 1 | 1900 | A |
| 1 | 1900 | B |
| 1 | 1900 | C |
| 1 | 1901 | A |
| 1 | 1902 | D |
| 1 | 1902 | E |
| 2 | 1900 | A |
| 2 | 1901 | B |
| 2 | 1901 | C |
| 3 | 1900 | A |
统计需求
输出每个(id, year)组合对应的累计独有事件数:即统计到当前年份为止,该id下出现过的所有不同事件的总数量,预期输出如下:
| id | year | cum_sum |
|---|---|---|
| 1 | 1900 | 3 |
| 1 | 1901 | 3 |
| 1 | 1902 | 5 |
| 2 | 1900 | 1 |
| 2 | 1901 | 3 |
| 3 | 1900 | 1 |
实现代码
方法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
相关产品推荐
相关产品推荐

