2015-03-05 2 views
1

Ниже приведен пример данных, которые у меня есть.Получить совокупную сумму данных по дням и часам

 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, но я суммирую весь день, я не уверен, как сломать его по часам в столбце времени.

И у меня есть данные за несколько дней. Так что это не только на этот день. Это с того дня, почти каждый день до вчерашнего дня.

Спасибо!

+0

Либо) вы ** [использовать соединение group_by выражение] (http://stackoverflow.com/questions/24573485/calculate-hourly-means-in-r-based-on-multiple-conditions?rq=1) ** (в этом случае я рекомендую dplyr), иначе b) вы ** [конвертируете отдельные, даты + поля времени в объект datetime] (http://stackoverflow.com/questions/8985124/how-to-create-a-datetime-object-from-separate-date-fields) **. В любом случае, это дубликат. Как только вы уточните, что вы предпочитаете, это должно быть закрыто как дублирующее. Моя рекомендация - dplyr с составным выражением group_by, она эффективна и чиста. – smci

ответ

0

Используйте соединение group_by(day,hour)

Это будет делать это.

+0

Я думаю, что это будет сделано, но столбец времени является фактором, и я не могу найти способ конвертировать коэффициент за раз, только время даты. Нужно ли комбинировать столбцы даты и времени вместе и превращать их в класс DateTime? –

+0

Вам не обязательно их комбинировать, но это один из способов, который мог бы работать. Посмотрите на все многочисленные дубликаты по этой проблеме, их задавали так много раз, что это не смешно. – smci

+0

Пожалуйста, укажите и отметьте как дубликат. Это будет более полезно для сайта, чем повторение того же вопроса. – Benjamin

1

Следующая следует сделать трюк, предполагая, что ваши данные примера сохраняются в кадре данных под названием «тест»:

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

Мой фрейм данных называется s3_files. Когда я меняю все экземпляры теста на s3_files и запускаю его, я получаю один номер назад, 1220046076. Который, на мой взгляд, является суммой всех файлов. Не почаще. –

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 прокладывает быстро!

+1

Я не знал о 'round (timestamp,« hour »)' (недостающее звено для моей проблемы). –

0

Если конвертировать 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")))) 
Смежные вопросы