假设数据类似于
group1 group2 num
A sg 1
A sh 2
A sg 4
B at 3
B al 7
a <- cumsum(data[,"num"]) # 1 3 7 10 17
我需要团队积累的东西。实际上,我有多列作为分组指标。我想通过我定义的子组获得累积的总和。
E.g
如果我只按group1
分组,则输出应为
group1 sum
A 1
A 3
A 7
B 3
B 10
如果我按两个变量group1,group2
分组,则输出为
group1 group2 sum
A sg 1
A sh 2
A sg 5
B at 3
B al 7
答案 0 :(得分:6)
{{1}}
答案 1 :(得分:6)
除了使用data.table
之外,基本R中的tapply
也适用于以下两种情况:
dta <- read.table(text="
group1 group2 num
A sg 1
A sh 2
A sg 4
B at 3
B al 7", header=TRUE)
dta$cumsum <- do.call(c, tapply(dta$num, dta$group1, FUN=cumsum))
按两组计算累计和需要重新排序:
dta <- dta[order(dta$group1, dta$group2, dta$num),]
dta$cumsum2 <- do.call(c, tapply(dta$num,
paste0(dta$group1, dta$group2),
FUN=cumsum))
dta
group1 group2 num cumsum cumsum2
1 A sg 1 1 1
3 A sg 4 7 5
2 A sh 2 3 2
5 B al 7 10 7
4 B at 3 3 3
如果您需要原始订单:
dta[as.numeric(rownames(dta)),]
group1 group2 num cumsum cumsum2
1 A sg 1 1 1
2 A sh 2 3 2
3 A sg 4 7 5
4 B at 3 3 3
5 B al 7 10 7