下面是我拥有的数据示例。
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和aggregate,但我正在总结一整天,我不知道如何在时间栏中按小时细分。
我有好几天的数据。所以这不仅仅是为了那一天。从那天开始,几乎每天都是,直到昨天。
谢谢!
假设您的示例数据存储在一个名为"测试"的数据帧中,则以下内容应该可以完成此操作:
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))
您可以使用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
燃烧得很快!
使用化合物group_by(day,hour)
这样就可以了。
如果将date
和time
列转换为单个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"))))