【问题标题】:R: Aggregating data between two dates without a loopR:在没有循环的情况下聚合两个日期之间的数据
【发布时间】:2014-10-20 10:01:24
【问题描述】:

我有两个数据框,一个包含交易数据(可以在任何时间间隔内发生),另一个将时间分解为每小时间隔。两者都包含带有日期和时间的列。一小时内可能有几笔交易,我想将交易数据框中一小时内的所有交易汇总到每小时数据框中的一行。

例如:
交易表

       Time                  Amount  
2014-09-10 13:01:01            10  
2014-09-10 13:05:13            20
2014-09-10 13:59:40             1  
2014-09-10 14:30:45             2  
2014-09-10 14:50:00            30  

我想在每小时表中汇总如下:

        Time         Amount
2014-09-10 14:00:00   31   (i.e. 10+20+1)
2014-09-10 15:00:00   32   (i.e. 2+30)

以上,2014-09-10 13:00:002014-09-10 14:00:00 之间的所有交易都已汇总并置于2014-09-10 14:00:00 下 我当前的代码如下所示:

for (m in 2:nrow(hourlyData))
{
      hourlyData[m,2] = sum(as.numeric(tradeData[intersect(which(tradeData[,1] < hourlyData[m,1]),
        which(tradeData[,1] >= hourlyData[m-1,1])),2])) #Get P&L aggregated by date        
}  

有效,但速度很慢。

有没有人建议我如何在没有 for 循环的情况下做到这一点?

谢谢

迈克

【问题讨论】:

    标签: r aggregate


    【解决方案1】:

    这里是data.table 方法

    library(data.table)
    setDT(df)[, list(Amount = sum(Amount)), 
                by = list(Time = as.POSIXct(Time, format = "%Y-%m-%d %H") + 3600)]
    #                   Time Amount
    # 1: 2014-09-10 14:00:00     31
    # 2: 2014-09-10 15:00:00     32
    

    编辑:这就是使用基本 R 有效(虽然更少)的方式

    with(df, tapply(Amount, (as.POSIXct(Time, format="%Y-%m-%d %H") + 3600), FUN = sum))
    

    或者(效率较低,但返回一个data.frame)

    with(df, aggregate(Amount, list((as.POSIXct(Time, format="%Y-%m-%d %H") + 3600)), FUN = sum))
    

    或者

    aggregate(df$Amount ~ with(df, as.POSIXct(Time, format="%Y-%m-%d %H") + 3600), FUN = sum)
    

    【讨论】:

      【解决方案2】:

      试试

       library(dplyr)
       df %>%
            group_by(Time=as.POSIXct(Time, format="%Y-%m-%d %H")+3600) %>%
            summarise(Amount=sum(Amount))
      

      给出输出

        #                 Time Amount
        #1 2014-09-10 14 00:00     31
        #2 2014-09-10 15 00:00     32
      

      数据

      df <- structure(list(Time = c("2014-09-10 13:01:01", "2014-09-10 13:05:13", 
      "2014-09-10 13:59:40", "2014-09-10 14:30:45", "2014-09-10 14:50:00"
      ), Amount = c(10L, 20L, 1L, 2L, 30L)), .Names = c("Time", "Amount"
      ), class = "data.frame", row.names = c(NA, -5L))
      

      【讨论】:

      • @David Arenburg 谢谢。实际上,我首先尝试的是基本解决方案。然后,我改变主意dplyr。也许我什至不需要创建变量。只需在 group_by 中使用它即可。
      • @Mike 这是一个pipe 运算符。它连接运算符的不同语句lhsrhs。以前的版本是%.%,现在改成现在的格式。你也可以通过这个链接r-statistics.com/2014/08/…
      • 感谢您的回复。我有一个类似但略有不同的问题:我将如何进行聚合(如您在上面所做的那样),然后将结果放入包含每小时数据的单独表中?因此,例如,另一个矩阵将包含 2014-09-10 的所有 24 小时,我想将上面的“31”放在 2014-09-10 14:00:00 行中。你能帮我解决这个问题吗?谢谢!
      • @Mike 请将其作为一个新问题发布。
      猜你喜欢
      • 1970-01-01
      • 2018-06-11
      • 2021-11-02
      • 1970-01-01
      • 2022-12-03
      • 1970-01-01
      • 2018-11-02
      • 2021-12-27
      相关资源
      最近更新 更多