使用dplyr进行小时总结,并对空小时补零

4
我有一个类似于下面 "my_data" 格式的数据集,其中每行是一个事件的单独计数。 我想获得每个小时发生的事件总数的摘要。我希望每个没有事件发生的小时都包括并将其 "hourly_total" 值设为0。虽然可以使用dplyr来实现这一点,但空白小时被删除而不是被设置为0。谢谢!
set.seed(123)
library(dplyr)
library(lubridate)

latemail <- function(N, st="2012/01/01", et="2012/1/31") {
       st <- as.POSIXct(as.Date(st))
       et <- as.POSIXct(as.Date(et))
       dt <- as.numeric(difftime(et,st,unit="sec"))
       ev <- sort(runif(N, 0, dt))
       rt <- st + ev
   }

my_data <- data_frame( fake_times = latemail(25),
                   count = 1)

my_data %>% group_by( rounded_hour = floor_date(fake_times, unit = "hour")) %>%
            summarise( hourly_total = sum(count))
1个回答

7
将您的计数分配给一个对象。
counts <- my_data %>% group_by( rounded_hour = floor_date(fake_times, unit = "hour")) %>%
    summarise( hourly_total = sum(count))

创建一个包含所有必要小时的数据框。
complete_data = data.frame(hour = seq(floor_date(min(my_data$fake_times), unit = "hour"),
                                      floor_date(max(my_data$fake_times), unit = "hour"),
                                      by = "hour"))

加入并填写NA

complete_data %>% group_by( rounded_hour = floor_date(hour, unit = "hour")) %>%
    left_join(counts) %>%
    mutate(hourly_total = ifelse(is.na(hourly_total), 0, hourly_total))

很棒!我稍微更改了你最后一部分的代码,通过在连接之后使用ungroup()来消除小时数的多余变量,并使用transmute()代替mutate()。干杯! - Michael

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接