用NA填写与时间序列缺失的月份

时间:2017-09-23 08:27:30

标签: r time-series

我有数据集: 年月数

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 个答案:

答案 0 :(得分:1)

这是一种方法。它设置了所有年份的列,然后将数据合并到其中,因此空白留在没有数据的地方。

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 :(得分:0)

一般来说,如果我们首先使用"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)