高效地添加时间序列中缺失的值

4

我有500个数据集(面板数据),每个数据集中都有一个跨越不同商店(店铺)的时间序列(周)。在每个商店内,我需要添加缺失的时间序列观测值。

我的数据样本为:

store   week           value
1           1          50
1           3          52
1           4          10
2           1          4
2           4          84
2           5          2

我希望它看起来像:

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

我目前使用以下代码(可以运行,但在我的数据上非常缓慢):
  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
  }

有更好、更高效的方法吗?
1个回答

8

这里有一个你可以尝试的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

默认情况下,如果您不指定fill参数,则新行将填充NA。由于您似乎有许多其他列,我建议不要使用填充参数,这样您就会得到NAs,如果需要,在另一个步骤中使用mutate_each将NAs转换为0(如果适用的话)。

group_by(df, store) %>% 
  complete(week = full_seq(week, 1L)) %>%
  mutate_each(funs(replace(., which(is.na(.)), 0)), -store, -week)

谢谢!我的变量比“value”多得多。那么我该如何调整代码的最后一部分呢? - Res1234

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