维持拆分 - 应用 - 组合问题的顺序

时间:2013-01-23 18:57:31

标签: r plyr

  

可能重复:
  How to ddply() without sorting?

我有以下数据框

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)),但它没有产生我预期的结果。

由于

3 个答案:

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