如何根据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变量并且修改了一个度量变量(例如收入),我想将其聚合到新变量“total_rev”中。它应该包含变量“rev”到特定行的总和,因此必须对每行进行如下计算:
> total_rev[i] = total_rev[i-1] + rev[i]
其中i是实际行
请注意,每个用户的计算必须从零开始。我已经尝试用一个循环来解决这个问题,它适用于一个小的测试用例,但是日期框架非常庞大,完整数据集上的计算只是不想结束。
答案 0 :(得分: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
答案 1 :(得分:2)
您可以使用?ave
和?cumsum
:
ave(df$rev, df$user, cumsum)
E.g:
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
答案 2 :(得分: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