将 Year/Quarter 数据帧转换为时间序列
Convert Year/Quarter Data Frame to Time Series
我是R新手,需要做时间序列分析。我的数据当前在数据框中。时间序列分析的适当格式似乎是 ts
或 xts
,具体取决于您阅读的文章。我只能根据找到的信息弄清楚如何到达 xts
表格。
我的问题是:
问题 1:如何将我的数据框转换为 ts
?
问题 2:将我的数据框转换为 xts
的方法比我所做的更好吗?
我做了什么
时间序列数据需要包含感兴趣的变量 x3
以及一个分类变量。该系列应按年季度给出。
数据类似于:
df <- data.frame(id = sprintf("%03d", 1:13),
year = c(2011, rep.int(2012,4), rep.int(2013,4), rep.int(2014,4)),
qtr = rep_len(c(4,1:3),13),
cat = sample(1:5, size=13, replace = TRUE),
x1 = sample.int(13)/100,
x2 = sample.int(13)/100,
x3 = sample.int(13)/100)
df
id year qtr cat x1 x2 x3
1 001 2011 4 4 0.10 0.05 0.11
2 002 2012 1 2 0.06 0.09 0.10
3 003 2012 2 1 0.12 0.02 0.03
4 004 2012 3 5 0.13 0.08 0.05
5 005 2012 4 1 0.04 0.06 0.04
6 006 2013 1 5 0.03 0.13 0.06
7 007 2013 2 4 0.05 0.12 0.12
8 008 2013 3 2 0.09 0.03 0.09
9 009 2013 4 4 0.11 0.01 0.13
10 010 2014 1 1 0.01 0.10 0.08
11 011 2014 2 2 0.08 0.07 0.07
12 012 2014 3 5 0.02 0.11 0.01
13 013 2014 4 3 0.07 0.04 0.02
我写的转换成xts
的代码如下:
library(zoo)
library(xts)
yq <- paste(df$year, "-", df$qtr, sep="")
df.yq <- cbind(df, as.yearqtr(yq))
df.xts <- xts(df.yq[,"x3"], order.by = df.yq[,"as.yearqtr(yq)"])
df.xts <- cbind(df.xts, df[,"cat"])
names(df.xts) <- c("x3", "cat")
这输出:
> df.xts
x3 cat
2011 Q4 0.11 4
2012 Q1 0.10 2
2012 Q2 0.03 1
2012 Q3 0.05 5
2012 Q4 0.04 1
2013 Q1 0.06 5
2013 Q2 0.12 4
2013 Q3 0.09 2
2013 Q4 0.13 4
2014 Q1 0.08 1
2014 Q2 0.07 2
2014 Q3 0.01 5
2014 Q4 0.02 3
我认为我的解决方案没有引入任何不一致之处,但感觉 "hacky." 我的问题既是关于良好形式的问题,也是关于学习数据操作的问题。如果您能提供给我任何信息,我们将不胜感激。
1) 首先将其转换为动物园,然后从那里 as.xts
和 as.ts
将起作用:
z <- with(df, zoo(cbind(x3, cat), as.yearqtr(year + (qtr-1)/4)))
x <- as.xts(z) # omit this line if you don't need x; can also omit library(xts)
tt <- as.ts(z)
1a) 这个变化也有效:
x <- with(df, xts(cbind(x3, cat), as.yearqtr(year + (qtr-1)/4)))
tt <- as.ts(as.zoo(x))
2) 如果您只对 ts 感兴趣,那么这不会使用任何包,但会假设数据是有序的并且没有遗漏的四分之一:
tt <- with(df, ts(cbind(x3, cat), start = c(year[1], qtr[1]), freq = 4))
更新 简化版 (2)。
我是R新手,需要做时间序列分析。我的数据当前在数据框中。时间序列分析的适当格式似乎是 ts
或 xts
,具体取决于您阅读的文章。我只能根据找到的信息弄清楚如何到达 xts
表格。
我的问题是:
问题 1:如何将我的数据框转换为 ts
?
问题 2:将我的数据框转换为 xts
的方法比我所做的更好吗?
我做了什么
时间序列数据需要包含感兴趣的变量 x3
以及一个分类变量。该系列应按年季度给出。
数据类似于:
df <- data.frame(id = sprintf("%03d", 1:13),
year = c(2011, rep.int(2012,4), rep.int(2013,4), rep.int(2014,4)),
qtr = rep_len(c(4,1:3),13),
cat = sample(1:5, size=13, replace = TRUE),
x1 = sample.int(13)/100,
x2 = sample.int(13)/100,
x3 = sample.int(13)/100)
df
id year qtr cat x1 x2 x3
1 001 2011 4 4 0.10 0.05 0.11
2 002 2012 1 2 0.06 0.09 0.10
3 003 2012 2 1 0.12 0.02 0.03
4 004 2012 3 5 0.13 0.08 0.05
5 005 2012 4 1 0.04 0.06 0.04
6 006 2013 1 5 0.03 0.13 0.06
7 007 2013 2 4 0.05 0.12 0.12
8 008 2013 3 2 0.09 0.03 0.09
9 009 2013 4 4 0.11 0.01 0.13
10 010 2014 1 1 0.01 0.10 0.08
11 011 2014 2 2 0.08 0.07 0.07
12 012 2014 3 5 0.02 0.11 0.01
13 013 2014 4 3 0.07 0.04 0.02
我写的转换成xts
的代码如下:
library(zoo)
library(xts)
yq <- paste(df$year, "-", df$qtr, sep="")
df.yq <- cbind(df, as.yearqtr(yq))
df.xts <- xts(df.yq[,"x3"], order.by = df.yq[,"as.yearqtr(yq)"])
df.xts <- cbind(df.xts, df[,"cat"])
names(df.xts) <- c("x3", "cat")
这输出:
> df.xts
x3 cat
2011 Q4 0.11 4
2012 Q1 0.10 2
2012 Q2 0.03 1
2012 Q3 0.05 5
2012 Q4 0.04 1
2013 Q1 0.06 5
2013 Q2 0.12 4
2013 Q3 0.09 2
2013 Q4 0.13 4
2014 Q1 0.08 1
2014 Q2 0.07 2
2014 Q3 0.01 5
2014 Q4 0.02 3
我认为我的解决方案没有引入任何不一致之处,但感觉 "hacky." 我的问题既是关于良好形式的问题,也是关于学习数据操作的问题。如果您能提供给我任何信息,我们将不胜感激。
1) 首先将其转换为动物园,然后从那里 as.xts
和 as.ts
将起作用:
z <- with(df, zoo(cbind(x3, cat), as.yearqtr(year + (qtr-1)/4)))
x <- as.xts(z) # omit this line if you don't need x; can also omit library(xts)
tt <- as.ts(z)
1a) 这个变化也有效:
x <- with(df, xts(cbind(x3, cat), as.yearqtr(year + (qtr-1)/4)))
tt <- as.ts(as.zoo(x))
2) 如果您只对 ts 感兴趣,那么这不会使用任何包,但会假设数据是有序的并且没有遗漏的四分之一:
tt <- with(df, ts(cbind(x3, cat), start = c(year[1], qtr[1]), freq = 4))
更新 简化版 (2)。