2015-05-29 63 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))