【问题标题】:Parameterize object names in R在 R 中参数化对象名称
【发布时间】:2021-10-16 05:52:32
【问题描述】:

我需要将一些时间序列模型(使用 R 的“预测”库开发)应用到我的数据集中的不同行集。

行组由称为 INDEX 的序数变量定义,范围从 1 到 10。我想将模型的结果(即预测和准确度指标)存储在不同的对象中:这些对象的名称应该包含 INDEX 作为后缀。

下面是我需要为每个组复制的代码示例。当然,我可以复制并粘贴该部分,更改对象的名称,但我知道应该有一个更有趣的解决方案。我尝试了 for 循环,但没有成功。

ts_1 <- dataset[index=1,]
ts_1 <- ts(ts_1$y, frequency=12)

n_1 <-length(ts_1)

train_1 <-ts(ts_1[1:(n_1-12)], frequency=12)
test_1 <- ts_1[(n_1-(12-1)):n_1]

for_1 <- forecast(train_1, model=arima, h=12)
acc_1 <- accuracy(for_1, test_1)

谢谢!

【问题讨论】:

    标签: r time-series


    【解决方案1】:

    您可以使用assign 在您的全局环境中创建对象。例如,要为数据中的每个索引 1-10 创建一个 ts_* 对象,您可以编写以下循环。

    for(i in 1:10){
      assign(paste0("ts_", i), dataset[index == i, ])
    }
    

    【讨论】:

    • 谢谢!我不知道assign 函数。我尝试实现您的代码,并且可以很好地创建与每组行对应的 10 个数据框。但在那之后,如何动态引用每个ts_* 对象?例如,如何在for 循环中创建对象n_* &lt;-length(ts_*)?我试过ts_[i],但没有用。
    • 好的,最后我设法使用get().. 它有效,但对我来说似乎有点过于复杂。有什么建议吗?
    • 这里的代码:for(i in 1:10) { assign(paste0("ts_", i), na.omit(dataset[index == i,])) assign(paste0("ts_", i), ts(get(paste0("ts_", i))$y, frequency=12)) assign(paste0("n_", i), length(get(paste0("ts_", i)))) assign(paste0("train_", i), ts(get(paste0("ts_", i))[1:(get(paste0("n_", i))-12)], frequency=12)) assign(paste0("test_", i), get(paste0("ts_", i))[(get(paste0("n_", i))-11):(get(paste0("n_", i)))]) assign(paste0("for_", i), forecast(get(paste0("train_", i)), model=arima, h=12)) assign(paste0("acc_", i), accuracy(get(paste0("for_", i)), get(paste0("test_", i)))) }
    • 是的,如果您认为这些对象在您的环境中是独立的对象,这就是您需要做的。您还可以将这些对象保存为列表的单独元素,在这种情况下,您的引用会简单得多。如果此答案解决了您的问题,请点击绿色复选标记接受!