Res*_*234 3 r time-series missing-data
我有500个数据集(面板数据).每个我都有不同商店(商店)的时间序列(周).在每个商店内,我需要添加缺少的时间序列观察.
我的数据样本将是:
store week value
1 1 50
1 3 52
1 4 10
2 1 4
2 4 84
2 5 2
Run Code Online (Sandbox Code Playgroud)
我想看起来像:
store week value
1 1 50
1 2 0
1 3 52
1 4 10
2 1 4
2 2 0
2 3 0
2 4 84
2 5 2
Run Code Online (Sandbox Code Playgroud)
我目前使用以下代码(它可以工作,但我的数据需要很长时间):
stores<-unique(mydata$store)
for (i in 1:length(stores)){
mydata <- merge(
expand.grid(week=min(mydata$week):max(mydata$week)),
mydata, all=TRUE)
mydata[is.na(mydata)] <- 0
}
Run Code Online (Sandbox Code Playgroud)
是否有更好,更有效的方法?
这是你可以尝试的dplyr/tidyr选项:
library(dplyr); library(tidyr)
group_by(df, store) %>%
complete(week = full_seq(week, 1L), fill = list(value = 0))
#Source: local data frame [9 x 3]
#
# store week value
# (int) (int) (dbl)
#1 1 1 50
#2 1 2 0
#3 1 3 52
#4 1 4 10
#5 2 1 4
#6 2 2 0
#7 2 3 0
#8 2 4 84
#9 2 5 2
Run Code Online (Sandbox Code Playgroud)
默认情况下,如果未指定fill参数,则将填充新行NA.由于您似乎有许多其他列,我建议省略填充参数,以便最终得到NA,如果需要,再做一步,mutate_each将NAs变为0(如果合适).
group_by(df, store) %>%
complete(week = full_seq(week, 1L)) %>%
mutate_each(funs(replace(., which(is.na(.)), 0)), -store, -week)
Run Code Online (Sandbox Code Playgroud)