使用NA填充时间序列中缺失的月份

3
我有一个数据集: 年份-月份 数量
2002-01    2.392909
2002-02    2.496800
2002-03    2.341897
2002-04    1.665625
2002-05    2.398261
2003-01    1.765912
2003-03    3.270870
2003-12    2.907812

我需要最终得到如下结果:

2002-01    2.392909
2002-02    2.496800
2002-03    2.341897
2002-04    1.665625
2002-05    2.398261
2002-06    NA
2002-07    NA
2002-08    NA
2002-09    NA
2002-10    NA
2002-11    NA
2002-12    NA
2003-01    1.765912
2003-02    NA
2003-03    3.270870
2002-04    NA
2003-05    NA
2003-06    NA
2003-07    NA
2003-08    NA
2003-09    NA
2003-10    NA
2003-11    NA
2003-12    2.907812

所有缺失的月份都会以NA填充,一直到12月为止。如有任何想法,敬请赐教!

2个回答

2
这里有一种方法。它设置了一个包含所有年月的列,然后将您的数据合并到其中,因此在没有数据的地方留下空白。
merge(data.frame(V1=paste(rep(2002:2003,each=12), #the years
                          sprintf("%02d",1:12), #the months, padded with zeros
                          sep="-")),
      df, #your dataframe (assumes the first column is "V1")
      all.x=TRUE)

        V1       V2
1  2002-01 2.392909
2  2002-02 2.496800
3  2002-03 2.341897
4  2002-04 1.665625
5  2002-05 2.398261
6  2002-06       NA
7  2002-07       NA
8  2002-08       NA
9  2002-09       NA
10 2002-10       NA
11 2002-11       NA
12 2002-12       NA
13 2003-01 1.765912
14 2003-02       NA
15 2003-03 3.270870
16 2003-04       NA
17 2003-05       NA
18 2003-06       NA
19 2003-07       NA
20 2003-08       NA
21 2003-09       NA
22 2003-10       NA
23 2003-11       NA
24 2003-12 2.907812

1

一般来说,如果我们一开始使用时间序列表示(例如 "zoo""ts" 类),处理时间序列会更加容易。

library(zoo)

z0 <- read.zoo(DF0, FUN = as.yearmon) # zoo object
tt <- as.ts(z0) # convert to ts class -- this fills in the NAs
zz <- as.zooreg(tt) # convert back to zoo
fortify.zoo(zz) # convert to data.frame

如果需要时间序列对象作为结果,我们可以在创建ttzz后停止。 magrittr 这也可以用magrittr管道表达如下:
library(magrittr)
library(zoo)

DF0 %>%
    read.zoo(FUN = as.yearmon) %>%
    as.ts %>%
    as.zooreg %>%
    fortify.zoo

注意:在可重现的形式中,输入DF0被假定为:

Lines <- "
2002-01    2.392909
2002-02    2.496800
2002-03    2.341897
2002-04    1.665625
2002-05    2.398261
2003-01    1.765912
2003-03    3.270870
2003-12    2.907812"
DF0 <- read.table(text = Lines, header = TRUE)

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