汇总一年中每个月的每小时数据
Aggregate hourly data for each month of the year
我四处寻找类似的东西,但找不到任何东西。我有一个看起来像这样的机场数据集(我将时间四舍五入):
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:00)。
我目前可以通过在自己的列表中过滤掉每个月,然后将它们与完整的小时列表完全合并来得到我的答案,但这真的很慢,因为我必须这样做 12 次。理想情况下,我试图以这样的方式结束:
Hour Month January February March ... December
00:00 1 ### ### ### ... ###
01:00 1 ### ### ### ... ###
...
00:00 12 ### ### ### ... ###
23:00 12 ### ### ### ... ###
其中 ### 是该月该小时的航班数量。有什么好的方法吗?
注意:我在想,如果我能以某种方式加入每个月的小时数和我的完整小时数列表,并将所有 na 替换为 0,那将可行,但我不知道如何正确地做到这一点。
希望这个问题是有道理的。如果有任何不清楚的地方,我很乐意澄清。
编辑:
如果你想尝试使用 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()
请注意 arrivals 如何没有第 1 个月、小时 02:00、03:00 等的任何内容。我想要做的是让这是一个完整的数据集,其中缺少小时数填写为0.
这是你想要做的吗?我不确定我是否完全按照您的意愿进行汇总,但是 !is.na 应该可以满足您的需求。
arrivals <- allFlights %>% group_by(month(Date), Arrival_Time) %>%
rowwise() %>%
summarise(month = plyr::count(!is.na(Arrival_Time)))
编辑:我可能不清楚。您是否希望在没有数据的时间段内显示零?
所以我在圈它。有一个很酷的包装,称为 padr
,它将 "pad" date/time 带有 NA 的条目用于缺失值。因为有time_hour
字段,所以可以用pad
。
library(padr)
allFlightsPad <- allFlights %>% pad
然后你可以从那里总结。有关信息,请参阅 this page。
我想你可以使用下面的代码来生成你需要的东西。
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
我四处寻找类似的东西,但找不到任何东西。我有一个看起来像这样的机场数据集(我将时间四舍五入):
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:00)。
我目前可以通过在自己的列表中过滤掉每个月,然后将它们与完整的小时列表完全合并来得到我的答案,但这真的很慢,因为我必须这样做 12 次。理想情况下,我试图以这样的方式结束:
Hour Month January February March ... December
00:00 1 ### ### ### ... ###
01:00 1 ### ### ### ... ###
...
00:00 12 ### ### ### ... ###
23:00 12 ### ### ### ... ###
其中 ### 是该月该小时的航班数量。有什么好的方法吗?
注意:我在想,如果我能以某种方式加入每个月的小时数和我的完整小时数列表,并将所有 na 替换为 0,那将可行,但我不知道如何正确地做到这一点。
希望这个问题是有道理的。如果有任何不清楚的地方,我很乐意澄清。
编辑: 如果你想尝试使用 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()
请注意 arrivals 如何没有第 1 个月、小时 02:00、03:00 等的任何内容。我想要做的是让这是一个完整的数据集,其中缺少小时数填写为0.
这是你想要做的吗?我不确定我是否完全按照您的意愿进行汇总,但是 !is.na 应该可以满足您的需求。
arrivals <- allFlights %>% group_by(month(Date), Arrival_Time) %>%
rowwise() %>%
summarise(month = plyr::count(!is.na(Arrival_Time)))
编辑:我可能不清楚。您是否希望在没有数据的时间段内显示零?
所以我在圈它。有一个很酷的包装,称为 padr
,它将 "pad" date/time 带有 NA 的条目用于缺失值。因为有time_hour
字段,所以可以用pad
。
library(padr)
allFlightsPad <- allFlights %>% pad
然后你可以从那里总结。有关信息,请参阅 this page。
我想你可以使用下面的代码来生成你需要的东西。
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