2015-05-29 65 views
2

我的日曆天數據幀,並與像這樣關聯值每小時觀測:填充缺失的觀察[R

startTime Hour delay 
    04-22  0  10 
    04-22  1  10 
    04-22  3  10 
    04-22  4  10 

所需要的是一天中任何時間與所述丟失小時,而不是沒有價值相關聯的0或NA。這將如何最好地實現?我試圖從虛擬數據框的dplyr full_join,但這種方法看起來笨重和低效。

總之,我需要這樣的:

startTime Hour delay 
    04-22  0  10 
    04-22  1  10 
    04-22  2  0 
    04-22  3  10 
    04-22  4  10 

回答

3

你可以使用data.table有效地加入數據集。將'data.frame'轉換爲'data.table ( setDT(df1)), set the key columns ( setkey(..,startTime,Hour)`),並加上'startTime'和'Hour'的唯一值的組合,並將NA與 '0'

library(data.table) 
setkey(setDT(df1), startTime, Hour)[CJ(startTime=unique(startTime), 
    Hour=min(Hour):max(Hour))][is.na(delay), delay:=0L] 
# startTime Hour delay 
#1:  04-22 0 10 
#2:  04-22 1 10 
#3:  04-22 2  0 
#4:  04-22 3 10 
#5:  04-22 4 10 

,或利用base Rmerge/expand.grid值延遲,我們可以得到上述結果

merge(expand.grid(startTime=unique(df1$startTime), 
     Hour= min(df1$Hour):max(df1$Hour)), df1, all.x=TRUE) 
2

使用dplyr和動物園:

library(dplyr) 
library(zoo) #na.locf 

#dummy data 
df1 <- read.table(text=" startTime Hour delay 
    04-22  0  10 
        04-22  1  10 
        04-22  3  10 
        04-22  4  10",header=TRUE) 

#result 
full_join(df1,data.frame(Hour=0:23), 
      by="Hour") %>% 
    arrange(Hour,startTime) %>% 
    mutate(startTime=na.locf(startTime), 
     delay=ifelse(is.na(delay),0,delay))