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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 08:45:31