首页 > 解决方案 > 如何在 R 中使用“for”循环来创建不同的时间序列

问题描述

我是 R 新手,我正在尝试解决以下问题:我需要为 40 个不同的城市创建 40 个不同的季节性调整时间序列。适用于一个时间序列的代码如下所示(在本例中为斯德哥尔摩)

stockholmtsdecomp = stl(stockholmts[,5], window="periodic")

des_stockholmts <- seasadj(stockholmtsdecomp) #

时间序列斯德哥尔摩已经存在的地方(以及其他 39 个城市)

如何迭代城市?解决它的一种方法是为每个城市重写 40​​ 次。我想循环执行以节省时间。我想到的是(这里只有 3 个城市)

lanlist=list('stockholm', 'oslo', 'madrid')

for (i in lanlist)
{
  x=(paste(i,'ts', sep=""))
  y=(paste(i,'tsdecomp', sep=""))
  z=(paste('des_',i,'ts', sep=""))
  y = stl(x[,5], window="periodic")
  z <- seasadj(y)
}

这显然是行不通的。任何巧妙的解决方案?

谢谢!

标签: rloopsfor-looptime-series

解决方案


您可以使用函数as.symbol()eval()检索您在循环中构建的变量名称作为语言符号,并在它们用作输入时评估它们(例如x在您的代码中)。

您可以使用函数assign()创建一个变量,当它们用作输出时(例如yz在您的代码中),其名称由变量给出。

这是一个概念证明示例,它显示了如何使用您的变量x以及z对应于两个城市的两个时间序列来工作:

oslots = c(3.5, 2.1, 1.7)
madridts = c(1.9, 2.8, 3.1)
lanlist=list('oslo', 'madrid')
for (i in lanlist)
{
  x = paste(i, 'ts', sep="")
  cat("Processing time series '", x, "'...\n", sep="")

  z = paste('des_', i, 'ts', sep="")
  assign(z, eval(as.symbol(x))[1])
  cat("The first value of time series '", x, "' is: ", eval(as.symbol(z)), "\n", sep="")

  cat("\n")
}

它应该输出以下内容:

Processing time series 'oslots'...
The first value of time series 'oslots' is: 3.5

Processing time series 'madridts'...
The first value of time series 'madridts' is: 1.9

我相信您将能够将这些概念应用到执行时间序列的季节性和趋势分解的代码中。


推荐阅读