2017-09-23 70 views
2

在时间序列上我有数据集: 年 - 月数填充缺少的月用NA

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填写,直到Dec 任何想法非常感谢!

回答

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 
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)