3

如何根据 R 中前一行的结果进行计算?为了更清楚,想象一下下面的数据框:

user   rev   total_rev
A      10    10   
A      10    20 
A      20    40
A      10    50
B      50    50  
C      50    50   
C      10    60
C      20    80

其中 user 是一个唯一的 ID 变量,rev 是一个度量变量(例如收入),我想将其聚合到新变量“total_rev”中。它应该包含变量“rev”到特定行的总和,因此必须对每一行进行如下计算:

> total_rev[i] = total_rev[i-1] + rev[i]

其中 i 是实际线

请注意,每个用户的计算必须从零开始。我已经尝试用一个循环来解决这个问题,该循环适用于一个小测试用例,但是日期帧非常大,并且对完整数据集的计算只是不想结束。

4

3 回答 3

3

在处理庞大的数据库时,data.table是一个不错的选择

> library(data.table)
> DT <- data.table(df)
> DT[, total:= cumsum(rev), by=list(user) ]
> DT
   user rev total_rev total
1:    A  10        10    10
2:    A  10        20    20
3:    A  20        40    40
4:    A  10        50    50
5:    B  50        50    50
6:    C  50        50    50
7:    C  10        60    60
8:    C  20        80    80
于 2013-09-12T15:58:24.647 回答
2

你可以使用?aveand ?cumsum

ave(df$rev, df$user, cumsum)

例如:

df <- read.table(textConnection("user   rev   total_rev
A      10    10   
A      10    20 
A      20    40
A      10    50
B      50    50  
C      50    50   
C      10    60
C      20    80"), header=TRUE)

df$total <- ave(df$rev, df$user, cumsum)
#  user rev total_rev total
#1    A  10        10    10
#2    A  10        20    20
#3    A  20        40    40
#4    A  10        50    50
#5    B  50        50    50
#6    C  50        50    50
#7    C  10        60    60
#8    C  20        80    80
于 2013-09-12T15:52:13.767 回答
0
library(plyr)
mydata<-mtcars
ddply(mydata,.(cyl),transform,mpg=cumsum(mpg))

对于您的数据:

library(plyr)
ddply(yourdata,.(user),transform,total_rev=cumsum(rev))

 user rev total_rev
1    A  10        10
2    A  10        20
3    A  20        40
4    A  10        50
5    B  50        50
6    C  50        50
7    C  10        60
8    C  20        80
于 2013-09-12T15:51:31.233 回答