在R中按ID分组,对各年份前3和前5个观测值求和
R批量计算分组滚动前N项求和
样本数据
首先是你的数据库结构示例:
ID <- c(1,1,1,1,1,1,3,3,3,5,5,4,4,4,4,4,4,4) C <- c('a','a','a','a','a','a','b','b','b','b','b','c','c','c','c','c','c','c') fyear <- c(2000, 2001, 2002,2003,2004,2005,2000, 2001,2002,2003,2004,2000, 2001, 2002,2003,2004,2005,2006) data <- c(30,50,22,3,6,11,5,3,7,6,9,31,5,6,7,44,33,2) # 模拟多列场景,新增data2列 data2 <- data * 2 df1 <- data.frame(ID,C,fyear, data, data2)
需求说明
按ID分组,对每个年份的指定字段计算:
- 前3项(含当前行在内的最近3行)求和,生成
xxx3列 - 前5项(含当前行在内的最近5行)求和,生成
xxx5列
要求支持对多列类似data的字段批量生成对应求和列。
解决方案
使用dplyr进行分组和批量处理,slider包高效实现滚动窗口求和:
1. 安装并加载依赖包
# 首次运行需安装 install.packages(c("dplyr", "slider")) # 加载包 library(dplyr) library(slider)
2. 批量生成求和列
# 指定需要处理的字段(可添加多个,比如c("data", "data2")) target_cols <- c("data", "data2") # 处理数据 df_result <- df1 %>% arrange(ID, fyear) %>% # 确保每个ID内按年份排序,这是滚动计算的前提 group_by(ID) %>% mutate( across( all_of(target_cols), list( # 前3项求和:窗口包含当前行及之前2行,仅窗口完整时返回值 "3" = ~slide_sum(.x, before = 2, after = 0, complete = TRUE), # 前5项求和:窗口包含当前行及之前4行,仅窗口完整时返回值 "5" = ~slide_sum(.x, before = 4, after = 0, complete = TRUE) ), .names = "{.col}{.fn}" # 设置新列名格式:原字段名+后缀3/5 ) ) %>% ungroup()
3. 查看结果
比如查看ID=1的结果:
df_result %>% filter(ID == 1)
输出示例:
# A tibble: 6 × 9 ID C fyear data data2 data3 data5 data23 data25 <dbl> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> 1 1 a 2000 30 60 NA NA NA NA 2 1 a 2001 50 100 NA NA NA NA 3 1 a 2002 22 44 102 NA 204 NA 4 1 a 2003 3 6 75 NA 150 NA 5 1 a 2004 6 12 31 111 62 222 6 1 a 2005 11 22 20 86 40 172
代码说明
arrange(ID, fyear):保证每个CEO的记录按年份升序排列,避免滚动计算出错across(all_of(target_cols), ...):批量遍历所有目标字段,无需重复写代码slide_sum:专门处理滚动窗口求和,before = n-1表示包含当前行在内共n行,complete = TRUE确保只有窗口行数足够时才返回求和值,否则返回NA.names参数自动生成规范的新列名,比如data对应data3和data5
内容的提问来源于stack exchange,提问作者Erika Dal Cortivo
相关产品推荐
相关产品推荐

