R:在没有循环的情况下在两个日期之间聚合数据

时间:2014-10-20 10:01:24

标签: r aggregate

我有两个数据框,一个是交易数据(可以在任何时间间隔内发生),另一个是时间间隔。两者都包含一个包含日期和时间的列。一小时内可以进行多笔交易,我希望将交易数据框中一小时时段内的所有交易汇总到每小时数据框中的一行。

例如:
交易表

       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循环的情况下做到这一点?

由于

麦克

2 个答案:

答案 0 :(得分:4)

这是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)

答案 1 :(得分:3)

尝试

 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))