【问题标题】:Read a time series table using read.zoo使用 read.zoo 读取时间序列表
【发布时间】:2011-06-10 05:26:32
【问题描述】:

我找遍了整个地方,但我找不到以前在哪里问过这个问题。

将这些数据放入适当的动物园系列的干净方法是什么?这个版本是一个复制/粘贴,使这篇文章更容易,但它总是以下表的形式出现(来自文本文件)。我的 read.zoo() 语句将 Year 读取为索引,但将季度(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    

【问题讨论】:

    标签: r time-series zoo


    【解决方案1】:

    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 
    

    【讨论】:

    • 对于 melt() 函数文档来说,这将是一个非常好的示例。我从这条路开始,但我的 zt 版本是 zt
    【解决方案2】:

    使用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 
    

    【讨论】:

    • 从 t(coredata(z)) 到 c(t(coredata(z))) 的那一步真是令人惊讶。从 matrix() 语句来看,它不应该是,但它是。
    • 请注意,由于比尔的评论 c(t(coredata(z))) 已被编辑以缩短为 c(t(z))
    猜你喜欢
    • 1970-01-01
    • 2017-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-26
    • 2011-09-22
    相关资源
    最近更新 更多