2014-12-01 52 views
3

我有一個類似於下面「my_data」格式的數據集,其中每行是一個事件的單個計數。我想獲得每小時發生多少事件的總結。我希望每個小時都沒有包含任何事件的「hourly_total」值爲0。dplyr每小時和空時爲零

我可以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)) 

回答

6

將您的計數對象

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

太棒了!我改變了你的最後一部分,以便在加入之後使用ungroup()來除掉多餘的變量,然後使用transmute()而不是mutate()。乾杯! – Michael 2014-12-01 22:55:40