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

如何在R中按ID分组对上方行累加求和(面板数据处理)

如何在R中按实体(company_id)分组对列B进行累加求和?

我正在处理面板数据,需要按实体(company_id)在不同时间段汇总信息。作为R新手,我确信这个操作可以轻松实现。我的数据格式如下:

mydata <- structure(list(company_id = c(1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3), A = c(3, 3, 3, 3, 4, 4, 4, 4, 4, 6, 6, 6, 6, 6, 6, 6), B = c(3, 6, 9, 12, 4, 8, 12, 16, 20, 6, 12, 18, 24, 30, 36, 42)), .Names = c("company_id", "A", "B"), row.names = c(NA, -16L), class = c("tbl_df", "tbl", "data.frame"))

数据预览:

# A tibble: 16 x 3
   company_id     A     B
        <dbl> <dbl> <dbl>
 1          1     3     3
 2          1     3     6
 3          1     3     9
 4          1     3    12
 5          2     4     4
 6          2     4     8
 7          2     4    12
 8          2     4    16
 9          2     4    20
10          3     6     6
11          3     6    12
12          3     6    18
13          3     6    24
14          3     6    30
15          3     6    36
16          3     6    42

我希望按company_id分组对列B进行累加求和,请问最高效的实现方式是什么?


高效实现方案

作为经常处理面板数据的R用户,我推荐两种简单高效的方法,其中第一种对新手特别友好:

方法一:用dplyr包(直观易读,适合新手)

dplyr是处理数据分组操作的神器,语法清晰,处理大型数据也很高效。步骤如下:

  1. 先安装并加载包(如果还没装的话):
install.packages("dplyr")
library(dplyr)
  1. 分组后生成累加求和列:
mydata_with_cumsum <- mydata %>%
  group_by(company_id) %>% # 按公司ID分组
  mutate(B_cumsum = cumsum(B)) %>% # 对每组的B列累加求和
  ungroup() # 可选:取消分组,让数据回到常规数据框状态

运行后你会得到带累加列的新数据,结果里每个公司的B列会从第一行开始逐步累加,比如company_id=1的行,B_cumsum会是3、9、18、30,完全符合你的需求。

方法二:Base R原生方法(无需额外包)

如果你不想加载第三方包,用base R的ave()函数也能快速实现:

mydata$B_cumsum <- ave(mydata$B, mydata$company_id, FUN = cumsum)

这个方法一行代码搞定,不需要额外依赖,适合喜欢原生R语法的用户,结果和上面完全一致。

为什么这两种方法高效?

  • dplyr的分组操作经过底层优化,处理几万甚至几十万行的面板数据都不会卡顿,而且语法直白,新手看一眼就懂。
  • ave()是base R专门为分组计算设计的函数,底层实现高效,不需要额外安装包,轻量快捷。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:21:42