cumsum 按组
cumsum by group
假设数据看起来像
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
我需要群里积累的东西。实际上,我有多个列作为分组指标。我想通过我定义的子组得到累加和。
例
如果我只按 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
library(data.table)
data <- data.table(group1=c('A','A','A','B','B'),sum=c(1,2,4,3,7))
data[,list(cumsum = cumsum(sum)),by=list(group1)]
除了使用 data.table
之外,在 base 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
假设数据看起来像
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
我需要群里积累的东西。实际上,我有多个列作为分组指标。我想通过我定义的子组得到累加和。
例
如果我只按 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
library(data.table)
data <- data.table(group1=c('A','A','A','B','B'),sum=c(1,2,4,3,7))
data[,list(cumsum = cumsum(sum)),by=list(group1)]
除了使用 data.table
之外,在 base 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