在R中存储复杂的时间序列

时间:2011-05-02 01:11:00

标签: r statistics dataframe time-series

我有一个包含多个列的数据框:

  • 状态

然后是x,y和z,其中x,y和z是上面列出的三联体特有的观察结果。我正在寻找一种理智的方式来存储这个时间序列,xts不会让我,因为每个时间索引有多个观察。我查看了hts软件包,但是我无法弄清楚如何从数据框中获取数据。

(是的,我确实在Quora上发布了相同的问题,并建议将它带到这里!)

1 个答案:

答案 0 :(得分:8)

一种选择是重塑您的数据,以便为每个州与县组合提供一列。这允许您构造一个xts矩阵:

require(reshape)
Opt1 <- as.data.frame(cast(Data, Date ~ county + State, value="Val"))
rownames(Opt1) <- Opt1$Date
Opt1$Date <- NULL
as.xts(Opt1)

或者,您可以使用xts对象列表,每次都确保您具有xts要求的正确格式。任何其他时间序列包也是如此。可能的解决方案是:

Opt2 <- 
  with(Data,
    by(Data,list(county,State,year),
      function(x){
        rownames(x) <- x$Date
        x <- x["Val"]
        as.xts(x)
      }
    )
  )

这将允许类似:

Opt2[["d","b","2012"]]

选择特定的时间序列。您可以使用所有xts选项。你可以遍历县,州和年份来构建像这样的情节:

enter image description here

情节代码:

counties <- dimnames(Opt2)[[1]]
states <- dimnames(Opt2)[[2]]
years <- dimnames(Opt2)[[3]]

op <- par(mfrow=c(3,6))
apply(
  expand.grid(counties,states,years),1,
  function(i){
    plot(Opt2[[i[1],i[2],i[3]]],main=paste(i,collapse="-"))
    invisible()
  }
)
par(op)

测试数据:

Data <- data.frame( State = rep(letters[1:3],each=90),
            county = rep(letters[4:6],90),
            Date = rep(seq(as.Date("2011-01-01"),by="month",length.out=30),each=3),
            Val = runif(270)
)
Data$year <- as.POSIXlt(Data$Date)$year + 1900