R用原始数据制作时间序列数据

R make timeseries data with raw data

我想用原始数据制作时间序列数据

样本数据是

factor date value
fac1 2011-01 10
fac1 2011-05 20
fac1 2011-07 30
fac2 2011-01 40
fac2 2011-03 50

我想在下面做

fac1 2011-01 10
fac1 2011-02 0
fac1 2011-03 20
fac1 2011-04 0
fac1 2011-05 30

.... it goes to 2011-12

fac2 2011-01 40
fac2 2011-02 0
fac2 2011-03 50
fac2 2011-04 0
fac2 2011-05 0

... it goes to 2011-12

我想按月显示这些因素并绘制图表 请帮助我。

我们创建一个扩展数据集 'factor' 和 'date',然后 merge 使用旧数据集

library(zoo)
df2 <- merge(expand.grid(factor = unique(df1$factor), 
    date= format(seq(as.Date(paste0(date[1],'-01')), length.out=12, 
          by = '1 month'), "%Y-%m")), df1, all.x = TRUE)

并将'value'中的NA个元素赋值给0

df2$value[is.na(df2$value)] <- 0

注意:未使用包


或与 data.table

类似的选项
library(data.table)
setDT(df1, key = c('factor', 'date'))
df1[CJ(factor, date=format(seq(as.Date(paste0(date[1],'-01')), length.out=12, by = '1 month'), 
          format = '%Y-%m'), unique = TRUE)][is.na(value), value := 0][]

这从 DF 创建了一个多变量动物园系列 z(在末尾的注释中重复显示)。 z 每个因素有一列和一个 yearmon class 索引。然后它将 z 与具有所有月份的零宽度系列合并,以填充给出 full 的空单元格。然后我们使用 na.fill 将合并创建的 NA 填充为 0 值。这给出 full0 类似于 full 除了缺少的月份用零填充。

我们不需要 long 来创建后续图,但是因为问题要求我们使用 ggfortify.zoofull0 生成它。

最后我们使用 ggplot2 绘制 full0。如果您希望每个系列都显示在单独的面板中,请在 autoplot 中省略 facet = NULL。此外,对于这么少量的数据,我发现 breaks = time(full0) 给出了一个很好的轴,但如果你在现实中有更多数据,那么你可能能够删除 scale_x_yearmon.

的参数
library(ggplot2)
library(zoo)

z <- read.zoo(DF, index = "date", split = "factor", FUN = as.yearmon)
full <- merge(z, zoo(, seq(start(z), end(z), 1/12)))
full0 <- na.fill(full, fill = 0)
long <- fortify(full0, melt = TRUE)

autoplot(full0, facet = NULL) + scale_x_yearmon(breaks = time(full0))

您也可以尝试 classic 绘图。如果您希望每个系列都有一个单独的面板,请省略 screen=1

plot(full0, screen = 1, col = 1:ncol(full0))

注意:可重现形式的输入数据DF是:

Lines <- "
factor date value
fac1 2011-01 10
fac1 2011-05 20
fac1 2011-07 30
fac2 2011-01 40
fac2 2011-03 50"
DF <- read.table(text = Lines, header = TRUE)