【问题标题】:Aggregate hourly data for each month of the year汇总一年中每个月的每小时数据
【发布时间】:2018-03-09 21:54:07
【问题描述】:

我四处寻找类似的东西,但找不到任何东西。我有一个机场数据集,看起来像这样(我将小时数四舍五入):

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()

请注意,第 1 个月、02:00、03:00 等小时,arrivals 没有任何内容。我要做的是让这是一个完整的数据集,其中缺失的小时数填写为 0。

【问题讨论】:

  • 你能用例如复制你的例子吗? nycflights13 包数据集?用一个可重现的例子来帮助你会更容易。
  • 当然!我将其发布为上面的编辑。您可能需要安装一些软件包才能使用转换功能来转换时间。我认为润滑?
  • 我使用您的逻辑检查了到达数据。 “03:00”、“04:00”、“05:00”似乎没有到达时间。即使那里没有观察到,您还希望这些时间出现吗?
  • 是的,我希望它们以 0 的计数出现

标签: r dplyr plyr zoo


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    这是你想要做的吗?我不确定我是否按照您想要的方式进行汇总,但是 !is.na 应该可以满足您的需求。

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

    编辑:我可能不清楚。您希望在没有数据的几个小时内显示零吗?

    所以我在盘旋它。有一个很酷的封装,称为padr,它将用 NA“填充”日期/时间条目以查找缺失值。因为有time_hour字段,所以可以使用pad

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

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

    【讨论】:

    • 对,我正在尝试用零填充缺失的数据。我试过你说的,但摘要似乎有问题?我收到一条错误消息:summarise_impl(.data, dots) 中的错误:month 列的长度必须为 1(汇总值),而不是 2
    • rowwise() 行试试看。要为缺失数据添加零“虚拟”值,您可以使用mutate 而不是summarize。另外,我也喜欢数据。
    • 似乎仍然无法让它工作:\。我发布了关于如何使用 nycflights13 包数据集解决类似问题的编辑。
    • 哦,我明白你要做什么了。问题是因为这些时间在任何表格中都不存在,您必须以某种方式生成它们,然后进行总结。一种可能的解决方案是创建一个小时表,其中包含 00:00 到 23:00,然后对其进行汇总。我正在研究一些接近的东西。我将编辑此评论。
    • 嗯...我在 nycflights13 数据集上运行它。它添加了行,但似乎仍然存在相同数量的缺失数据。也许我做错了什么。我尝试对 arr_time 和使用 hour(hour_time) 进行总结。我仍在按月和小时分组。
    猜你喜欢
    • 2022-06-27
    • 1970-01-01
    • 2017-11-14
    • 1970-01-01
    • 1970-01-01
    • 2011-07-09
    • 2011-08-28
    • 2013-02-17
    • 1970-01-01
    相关资源
    最近更新 更多