我有以下数据框
dd1 = data.frame(cond = c("D","A","C","B","A","B","D","C"), val = c(11,7,9,4,3,0,5,2))
dd1
cond val
1 D 11
2 A 7
3 C 9
4 B 4
5 A 3
6 B 0
7 D 5
8 C 2
现在需要计算关于cond中因子水平的累积总和。结果应该是这样的:
> dd2 = data.frame(cond = c("D","A","C","B","A","B","D","C"), val = c(11,7,9,4,3,0,5,2), cumsum=c(11,7,9,4,10,4,16,11))
> dd2
cond val cumsum
1 D 11 11
2 A 7 7
3 C 9 9
4 B 4 4
5 A 3 10
6 B 0 4
7 D 5 16
8 C 2 11
以与输入数据帧相同的顺序接收结果数据帧非常重要,因为还有其他变量绑定到该数据帧。
我尝试ddply(dd1, .(cond), summarize, cumsum = cumsum(val))
,但它没有产生我预期的结果。
由于
答案 0 :(得分:8)
改为使用ave
。
dd1$cumsum <- ave(dd1$val, dd1$cond, FUN=cumsum)
答案 1 :(得分:3)
如果手动执行此操作是一个选项,那么split()
和unsplit()
以及中间合适的lapply()
将为您执行此操作。
dds <- split(dd1, dd1$cond)
dds <- lapply(dds, function(x) transform(x, cumsum = cumsum(x$val)))
unsplit(dds, dd1$cond)
最后一行给出了
> unsplit(dds, dd1$cond)
cond val cumsum
1 D 11 11
2 A 7 7
3 C 9 9
4 B 4 4
5 A 3 10
6 B 0 4
7 D 5 16
8 C 2 11
我把这三个步骤分开了,但如果你做了很多这些步骤,这些步骤可以串在一起或放在一个函数中。
答案 2 :(得分:3)
data.table
解决方案:
require(data.table)
dt <- data.frame(dd1)
dt[, c.val := cumsum(val),by=cond]
> dt
# cond val c.val
# 1: D 11 11
# 2: A 7 7
# 3: C 9 9
# 4: B 4 4
# 5: A 3 10
# 6: B 0 4
# 7: D 5 16
# 8: C 2 11