如何在R中按ID分组求和生成df$TOTAL_VOLUME变量
解决方法
你可以用两种常用方式实现按ID分组求和并生成新列的需求:
1. 使用Base R的ave()函数
无需加载额外包,直接用base R内置的ave()函数即可完成,它会为每个分组重复填充计算后的总和:
首先构造示例测试数据(和你提供的表一致):
df <- data.frame( ID = c("A_001", "A_001", "A_001", "A_001", "B_002", "B_002", "C_003", "C_003", "C_003"), DATE = as.Date(c("2018-11-26", "2018-11-26", "2020-08-01", "2020-08-01", "2022-05-23", "2022-05-23", "2015-03-11", "2023-12-06", "2023-12-06")), AMOUNT = c(0.5, 0.5, 1.5, 1.5, 0.5, 0.5, 1.5, 0.5, 0.5) )
生成TOTAL_VOLUME列:
df$TOTAL_VOLUME <- ave(df$AMOUNT, df$ID, FUN = sum)
2. 使用tidyverse/dplyr包(更直观的分组语法)
如果你习惯tidyverse风格的代码,可以用dplyr的分组+突变操作:
先安装并加载包(未安装时先运行install.packages("tidyverse")):
library(dplyr) df <- df %>% group_by(ID) %>% mutate(TOTAL_VOLUME = sum(AMOUNT)) %>% ungroup() # 取消分组,避免后续操作受分组状态影响
最终结果
运行任意一种方法后,数据框会呈现你期望的效果:
| ID | DATE | AMOUNT | TOTAL_VOLUME |
|---|---|---|---|
| A_001 | 2018-11-26 | 0.5 | 4.0 |
| A_001 | 2018-11-26 | 0.5 | 4.0 |
| A_001 | 2020-08-01 | 1.5 | 4.0 |
| A_001 | 2020-08-01 | 1.5 | 4.0 |
| B_002 | 2022-05-23 | 0.5 | 1.0 |
| B_002 | 2022-05-23 | 0.5 | 1.0 |
| C_003 | 2015-03-11 | 1.5 | 2.5 |
| C_003 | 2023-12-06 | 0.5 | 2.5 |
| C_003 | 2023-12-06 | 0.5 | 2.5 |
内容的提问来源于stack exchange,提问作者Rabbit8
相关产品推荐
相关产品推荐

