【问题标题】:Some specific calculation in a data.framedata.frame 中的一些特定计算
【发布时间】:2013-09-17 02:36:20
【问题描述】:

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

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

【问题讨论】:

  • 欢迎来到 SO。这个问题非常简单,应该可以通过您的一些快速研究来解决。 R 是矢量化的,并且具有出色的聚合工具。看看这里,用谷歌搜索cumulative sumssplit-apply-combine 的数据操作策略。

标签: r dataframe data-manipulation


【解决方案1】:
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

【讨论】:

    【解决方案2】:

    您可以使用?ave?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
    

    【讨论】:

      【解决方案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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-02
        • 1970-01-01
        • 1970-01-01
        • 2021-02-17
        • 2020-07-07
        • 2020-10-29
        相关资源
        最近更新 更多