2017-09-23 115 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)