这里有多个完全属于“数据争吵”的问题。最大的问题是将实际值估算到您的缺失值字段中。
幸运的是,xts 时间序列库包含执行此操作的函数,以及绘制多个时间序列的函数,这是您的最终目标。
但是,在我们可以使用这些奇妙的功能之前,您必须做一些工作,将您的数据转换为 xts 对象。
首先使用@aelwan的方法重新创建上面的数据。
```{r, tidy=TRUE}
df <- read.table(text = c("
CompanyA NA 1000 NA NA NA 1000
CompanyB 600 NA NA NA 600 NA
CompanyC NA 5000 NA 5000 NA NA"),
header = F)
colnames(df) <- c("CompanyName", "2001-01", "2001-02" ,"2001-03", "2001-04", "2001-05", "2001-06")
df
CompanyName 2001-01 2001-02 2001-03 2001-04 2001-05 2001-06
1 CompanyA NA 1000 NA NA NA 1000
2 CompanyB 600 NA NA NA 600 NA
3 CompanyC NA 5000 NA 500 NA NA
您的数据似乎是宽格式,因此我建议将其转换为长格式。这将需要几个步骤来保留重要信息,例如列名和行名,以及数据的类别(数字)。
首先,转置数据框
df_t <- t(df)
现在,保存第一行,其中现在包含公司名称。
company_names <- df_t[1,]
转置过程产生一个“矩阵”类的对象。删除第一行并制作 df_t 对象类 data.frame。
df_t <- data.frame(df_t[-1, ], stringsAsFactors = FALSE)
添加存储在“company_names”中的公司名称作为列名
colnames(df_t) <- company_names
您的列数据类也可能在转置过程中丢失,因此请使用sapply 函数将所有列转换为数字类。
df_long <- data.frame(sapply(df_t, FUN=as.numeric), row.names = rownames(df_t))
# print the long form results
df_long
```
CompanyA CompanyB CompanyC
Jan 2001 NA 600 NA
Feb 2001 1000 NA 5000
Mar 2001 NA NA NA
Apr 2001 NA NA 5000
May 2001 NA 600 NA
Jun 2001 1000 NA NA
现在,将您的新df_long data.frame 转换为基于时间序列索引的xts 对象,以访问您需要的时间序列函数。
```{r}
library(xts)
# convert rownames "2001-01, 2001-02, ..." to yearmon format
rownames(df_long) <- as.yearmon(rownames(df_long), "%Y-%m")
# pass the dates as an index to the xts via the `order.by` arguement.
df_xts <- xts(df_long , order.by = as.yearmon(rownames(df_long)))
```
最后,我们可以使用xts包中的“Last Observation Carried Forward”功能,na.locf来填写日期。
```{r}
df_locf <- na.locf(df_xts)
df_locf
```
CompanyA CompanyB CompanyC
Jan 2001 NA 600 NA
Feb 2001 1000 600 5000
Mar 2001 1000 600 5000
Apr 2001 1000 600 5000
May 2001 1000 600 5000
Jun 2001 1000 600 5000
在xts 类的对象上调用plot 函数时,可以轻松生成多变量时间序列图。
```{r}
# The plot function works.
plot(df_locf)
```