3

可能重复:
如何在不排序的情况下进行 ddply()?

我有以下数据框

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

谢谢

4

3 回答 3

8

改为使用ave

dd1$cumsum <- ave(dd1$val, dd1$cond, FUN=cumsum)
于 2013-01-23T19:05:20.357 回答
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

我把这三个步骤分开了,但是如果你做了很多这样的事情,它们可以串在一起或放在一个函数中。

于 2013-01-23T19:06:44.760 回答
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
于 2013-01-23T19:07:32.340 回答