按天和小时获取数据的总和

时间:2015-03-05 14:19:15

标签: r aggregate compound-key

以下是我的数据示例。

     date       time    size    filename            day.of.week
1   2015-01-16  5:36:12 1577    01162015053400.xml  Friday
2   2015-01-16  5:38:09 2900    01162015053600.xml  Friday
3   2015-01-16  5:40:09 3130    01162015053800.xml  Friday

我想要做的是总结每小时文件的大小。

我想要一个结果数据表,如下所示:

date        hour   size
2015-01-16  5      7607
2015-01-16  6      10000

等等等等。

但我似乎无法获得我需要的输出。

我已尝试过ddply并汇总,但我总结了一整天,我不确定如何按时间栏中的小时分解。

我有多天的数据。所以它不仅仅适用于那一天。从那天开始,几乎每天都是直到昨天。

谢谢!

4 个答案:

答案 0 :(得分:1)

假设您的示例数据存储在名为“test”的数据框中,以下应该可以解决问题:

library(lubridate) # for hms and hour functions
test$time <- hms(test$time) 
test$hour <- factor(hour(test$time))
library(dplyr)
test %>%
   select(-time) %>% # dplyr doesn't like this column for some reason
   group_by(date, hour) %>%
   summarise(size=sum(size))

答案 1 :(得分:1)

您可以使用data.table

library(data.table)
# Define a time stamp column.
dt[, timestamp=as.POSIXct(strptime(paste(df$date, df$time), format = "%Y-%m-%d %H:%M:%S"))]
# Aggregate by hours
dt[, size = .N, by = as.POSIXct(round(timestamp, "hour"))]

好处是data.table非常快!

答案 2 :(得分:0)

使用复合group_by(day,hour)

那就行了。

答案 3 :(得分:0)

如果您将datetime列转换为单个POSIX日期when(类似于之前的答案,即df$when <- as.POSIXct(strptime(paste(df$date, df$time), format = "%Y-%m-%d %H:%M:%S"))),您可以使用:

aggregate(df[c("size")], FUN=sum, by=list(d=as.POSIXct(trunc(df$when, "hour"))))