data.frame中的一些特定计算

时间:2013-09-12 15:46:51

标签: r dataframe data-manipulation

如何根据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是实际行

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

3 个答案:

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