汇总一年中每个月的每小时数据

时间:2018-03-09 21:54:08

标签: r dplyr plyr zoo

我四处寻找类似的东西,却找不到任何东西。我有一个机场数据集看起来像这样(我把时间缩小了):

Date        Arrival_Time        Departure_Time        ...
2017-01-01  13:00               14:00                 ...
2017-01-01  16:00               17:00                 ...
2017-01-01  17:00               18:00                 ...
2017-01-01  11:00               12:00                 ...

问题是,在几个月内,没有特定时间的航班,这意味着我在一小时内缺少数据。如何提取每个月每小时的每小时到达时间,以便没有缺失值?

我尝试过使用dplyr并执行以下操作:

arrivals <- allFlights %>% group_by(month(Date), Arrival_Time) %>%
                            summarise(n()) %>%
                            na.omit()

但问题显然是因为group_by无法填写我丢失的数据。我最终得到每个月的数据,但不是一小时的条目(例如,第1个月,第22个小时没有条目)。

我现在可以通过在自己的列表中过滤每个月来获得我的答案,然后将它们与完整的小时列表完全合并,但这非常慢,因为我必须这样做12次。理想情况下,我试图以这样的方式结束:

Hour    Month    January    February    March   ...   December
00:00     1        ###        ###        ###     ...    ###
01:00     1        ###        ###        ###     ...    ###
 ...
00:00     12       ###        ###        ###     ...    ###
23:00     12       ###        ###        ###     ...    ###

其中###是该月该小时的航班数。这样做有什么好办法吗?

注意:我在想,如果我能以某种方式加入我每个月的完整小时列表,并用0来替换所有的那些,那么这样可行,但我无法和#39;弄清楚如何正确地做到这一点。

希望这个问题有道理。我很乐意澄清是否有任何不清楚的地方。

编辑: 如果您想使用nycflights13包尝试,可以使用以下代码重现我的尝试:

  allFlights <- nycflights13::flights

  allFlights$arr_time <- format(strptime(substr(as.POSIXct(sprintf("%04.0f", allFlights$arr_time), format="%H%M"), 12, 16), '%H:%M'), '%H:00')

  arrivals <- allFlights %>% filter(carrier == "MQ") %>% group_by(month, arr_time) %>% summarise(n()) %>% na.omit()

请注意,抵达在第1个月,第02:00,第03:00等时间内没有任何内容。我想要做的是这是一个完整的数据集,其中填写了缺少的小时数在0。

2 个答案:

答案 0 :(得分:0)

这是你想要做的吗?我不确定我是否正在按照你想要的方式进行聚合,但是!is.na应该做你正在寻找的东西。

arrivals <- allFlights %>% group_by(month(Date), Arrival_Time) %>%
            rowwise() %>%
            summarise(month = plyr::count(!is.na(Arrival_Time)))

编辑:我可能不太清楚。您是否希望在没有数据的情况下显示零时间?

所以我在盘旋它。有一个很酷的打包,称为padr,它将使用NAs“填充”日期/时间条目以获取缺失值。由于存在time_hour字段,因此您可以使用pad

library(padr)
allFlightsPad <- allFlights %>% pad

然后你可以从那里总结一下。有关信息,请参阅this page

答案 1 :(得分:0)

我认为你可以使用下面的代码来生成你需要的东西。

library(stringr)

dim_month_hour<-data.frame(expand.grid(hour=paste(str_pad(seq(0,23,1),2,"left","0"),"00",sep=":"),month=sort(unique(allFlights$month)),stringsAsFactors=F))

arrivals_full<-left_join(dim_month_hour,arrivals,by=c("hour"="arr_time","month"="month"))

arrivals_full[is.na(arrivals_full$`n()`),"n()"]<-0