使用 read.zoo 读取时间序列表

发布于 2024-10-12 07:45:03 字数 756 浏览 4 评论 0原文

我查遍了所有地方,但找不到以前问过这个问题的地方。

将这些数据放入适当的动物园系列中的干净方法是什么?此版本是复制/粘贴,以使这篇文章更容易,但它将始终采用下表形式(来自文本文件)。我的 read.zoo() 语句将年份读取为索引,但将季度(Qtr1、Qtr2 等)读取为列名称。我一直在试图找出一种非垃圾的方法来将列读取为索引的“四分之一”部分,但它很草率(太草率而无法发布)。我猜这个问题已经解决了,但我找不到它。

> texinp <- "   
+ Year   Qtr1  Qtr2  Qtr3  Qtr4   
+ 1992    566   443   329   341   
+ 1993    344   212   133   112   
+ 1994    252   252   199   207"   
> z <- read.zoo(textConnection(texinp), header=TRUE)
> z  

从 as.yearqtr() 文档来看,目标如下所示:

1992 Q1 1992 Q2 1992 Q3 1992 Q4 1993 Q1 1993 Q2 1993 Q3 1993 Q4    
    566     443     329     341     344     212     133     112      

1994 Q1 1994 Q2 1994 Q3 1994 Q4     
    252     252     199     207    

I've looked all over the place, but I can't find where this question has been asked before.

What is a clean way to get this data into a proper zoo series? This version is a copy/paste to make this post easier, but it will always come in the following table form (from a text file). My read.zoo() statement reads the Year as the index but the quarters (Qtr1, Qtr2, etc) are read as column names. I've been trying to figure out a non-garbage way to read the columns as the "quarter" part of the index, but it's sloppy (too sloppy to post). I'm guessing this problem has already been solved, but I can't find it.

> texinp <- "   
+ Year   Qtr1  Qtr2  Qtr3  Qtr4   
+ 1992    566   443   329   341   
+ 1993    344   212   133   112   
+ 1994    252   252   199   207"   
> z <- read.zoo(textConnection(texinp), header=TRUE)
> z  

From the as.yearqtr() documentation, the target would look like:

1992 Q1 1992 Q2 1992 Q3 1992 Q4 1993 Q1 1993 Q2 1993 Q3 1993 Q4    
    566     443     329     341     344     212     133     112      

1994 Q1 1994 Q2 1994 Q3 1994 Q4     
    252     252     199     207    

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

花之痕靓丽 2024-10-19 07:45:03

使用 read.zoo 读取数据,然后将其转换为具有 yearqtr 时间索引的 zooreg 对象:

texinp <- "Year   Qtr1  Qtr2  Qtr3  Qtr4   
1992    566   443   329   341   
1993    344   212   133   112   
1994    252   252   199   207"

library(zoo)

z <- read.zoo(text = texinp, header=TRUE)
zz <- zooreg(c(t(z)), start = yearqtr(start(z)), freq = 4)

结果如下所示:

> zz

1992 Q1 1992 Q2 1992 Q3 1992 Q4 1993 Q1 1993 Q2 1993 Q3 1993 Q4 1994 Q1 1994 Q2 1994 Q3 1994 Q4 
    566     443     329     341     344     212     133     112     252     252     199     207 

Read in the data using read.zoo and then convert it to a zooreg object with yearqtr time index:

texinp <- "Year   Qtr1  Qtr2  Qtr3  Qtr4   
1992    566   443   329   341   
1993    344   212   133   112   
1994    252   252   199   207"

library(zoo)

z <- read.zoo(text = texinp, header=TRUE)
zz <- zooreg(c(t(z)), start = yearqtr(start(z)), freq = 4)

The result looks like this:

> zz

1992 Q1 1992 Q2 1992 Q3 1992 Q4 1993 Q1 1993 Q2 1993 Q3 1993 Q4 1994 Q1 1994 Q2 1994 Q3 1994 Q4 
    566     443     329     341     344     212     133     112     252     252     199     207 
叶落知秋 2024-10-19 07:45:03

read.zoo 假设您的数据最多有一个时间索引列,因此您必须自己处理这一列。首先使用 read.table 读取它

zt <- read.table( textConnection( texinp ), header = TRUE)

,然后使用 reshape 包中的 melt 函数将其转换为“长表”:

require(reshape)
zt.m <- melt( zt, id = 'Year', variable_name = 'Qtr')

> zt.m
   Year  Qtr value
1  1992 Qtr1   566
2  1993 Qtr1   344
3  1994 Qtr1   252
4  1992 Qtr2   443
5  1993 Qtr2   212
6  1994 Qtr2   252
7  1992 Qtr3   329
8  1993 Qtr3   133
9  1994 Qtr3   199
10 1992 Qtr4   341
11 1993 Qtr4   112
12 1994 Qtr4   207

最后创建您想要的 zoo 对象:

z <- with( zt.m, zoo( value, as.yearqtr(paste(Year, Qtr), format = '%Y Qtr%q')))

> z
1992 Q1 1992 Q2 1992 Q3 1992 Q4 1993 Q1 1993 Q2 1993 Q3 1993 Q4 1994 Q1 1994 Q2 
    566     443     329     341     344     212     133     112     252     252 
1994 Q3 1994 Q4 
    199     207 

read.zoo assumes your data has at most one time-index column, so you have to process this yourself. First read it in using read.table

zt <- read.table( textConnection( texinp ), header = TRUE)

then convert it to a "long table" using the melt function from the reshape package:

require(reshape)
zt.m <- melt( zt, id = 'Year', variable_name = 'Qtr')

> zt.m
   Year  Qtr value
1  1992 Qtr1   566
2  1993 Qtr1   344
3  1994 Qtr1   252
4  1992 Qtr2   443
5  1993 Qtr2   212
6  1994 Qtr2   252
7  1992 Qtr3   329
8  1993 Qtr3   133
9  1994 Qtr3   199
10 1992 Qtr4   341
11 1993 Qtr4   112
12 1994 Qtr4   207

and finally create your desired zoo object:

z <- with( zt.m, zoo( value, as.yearqtr(paste(Year, Qtr), format = '%Y Qtr%q')))

> z
1992 Q1 1992 Q2 1992 Q3 1992 Q4 1993 Q1 1993 Q2 1993 Q3 1993 Q4 1994 Q1 1994 Q2 
    566     443     329     341     344     212     133     112     252     252 
1994 Q3 1994 Q4 
    199     207 
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文