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.zoo
从 full0
生成它。
最后我们使用 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)
我想用原始数据制作时间序列数据
样本数据是
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.zoo
从 full0
生成它。
最后我们使用 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)