3

以下是我所拥有的:

ID 年份 分数
1 1999 10
1 2000 11
1 2001 14
1 2002 22
2 2000 19
2 2001 17
2 2002 22
3 1998 10
3 1999 12

以下是我想做的事情:

ID 年份 总分
1 1999 10 10
1 2000 11 21
1 2001 14 35
1 2002 22 57
2 2000 19 19
2 2001 17 36
2 2002 22 48
3 1998 10 10
3 1999 12 22

每个 ID 的年数和具体年数各不相同。

我觉得这是 ddply 中的一些高级选项,但我一直无法找到答案。我也尝试过使用 for/while 循环,但由于这些循环在 R 中非常慢,而且我的数据集很大,所以它运行得不是很好。

提前致谢!

4

2 回答 2

2

您可以使用该sumsum功能并将其应用于ave所有子组。

transform(dat, Total = ave(Score, ID, FUN = cumsum))

  ID Year Score Total
1  1 1999    10    10
2  1 2000    11    21
3  1 2001    14    35
4  1 2002    22    57
5  2 2000    19    19
6  2 2001    17    36
7  2 2002    22    58
8  3 1998    10    10
9  3 1999    12    22
于 2013-03-14T17:19:15.180 回答
2

如果你的数据很大,那么ddply会很慢。

data.table是要走的路。

 library(data.table)
 DT <- data.table(dat)
 # create your desired column in `DT`
 DT[, agg.Score := cumsum(Score), by = ID]
于 2013-03-15T00:22:41.200 回答