cumsum by group

时间:2015-05-16 14:51:02

标签: r cumsum

假设数据类似于

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

2 个答案:

答案 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