R语言data.table多条件按季度向后求和问题求助
解决R中data.table按组计算后续记录y值累加的问题
没问题,我来帮你搞定这个data.table的分组累加需求,其实用data.table的分组特性配合时间排序就能轻松实现,一步步来:
先确认你的原始数据
首先我把你提供的原始数据整理成可运行的data.table代码:
library(data.table) dt <- data.table( n = c("a", "a", "b", "b", "a", "c"), b = c("1Q", "2Q", "1Q", "3Q", "4Q", "1Q"), year = c(1990, 1990, 1991, 2000, 1991, 2005), s = c("Rank1", "Rank1", "Rank2", "Rank3", "Rank1", "rank3"), y = c(10, 43, 42, 66, 55, 44) )
你的预期结果是:
# 预期输出 n b year s y 1: a 1Q 1990 Rank1 108 2: a 2Q 1990 Rank1 98 3: b 1Q 1991 Rank2 42 4: b 3Q 2000 Rank3 66 5: a 4Q 1991 Rank1 55 6: c 1Q 2005 rank3 44
具体实现步骤
1. 加载必要的工具包
我们需要用zoo包来处理季度时间,确保能正确按时间顺序排序:
# 如果没安装zoo包先执行这行 # install.packages("zoo") library(zoo) library(data.table)
2. 创建可排序的季度时间变量
把year和b列合并成标准的季度对象,这样后续能准确判断时间先后:
dt[, qtr := as.yearqtr(paste(year, b), format = "%Y %qQ")]
3. 按组计算后续记录的y值总和
核心逻辑是:
- 按
n和s分组(注意:s列的大小写会被视为不同组,比如"Rank3"和"rank3",如果需要忽略大小写可以先统一转成大写/小写,比如dt[, s := toupper(s)]) - 在每个组内按季度升序排列
- 用反向累加的方式计算当前行及之后所有同组记录的y值之和:
rev(cumsum(rev(y)))
执行代码:
dt[, y := rev(cumsum(rev(y))), by = .(n, s)][order(qtr)]
4. 清理临时变量(可选)
如果不需要保留刚才创建的qtr列,可以删掉:
dt[, qtr := NULL]
验证结果
现在打印处理后的data.table,就会和你预期的结果完全一致:
print(dt)
补充说明
rev(cumsum(rev(y)))的原理很简单:
比如n=a且s=Rank1的组,原始y值是[10,43,55],反转后变成[55,43,10],计算累加和得到[55,98,108],再反转回来就是[108,98,55],正好对应每条记录之后(含自身)的同组y值总和,完美匹配你的需求。
内容的提问来源于stack exchange,提问作者Maylo
相关产品推荐
相关产品推荐

