我有数据集: 年月数
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月 任何想法都非常感激!
答案 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
如果首选时间序列对象作为结果,我们可以在创建tt
或zz
后停止。
<强> 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)