【问题标题】:R programming how to apply individual elements in list to a functionR编程如何将列表中的单个元素应用于函数
【发布时间】:2014-12-06 15:58:02
【问题描述】:

我有一个包含多个元素的列表,我需要使用每个列表中的两个元素应用预测中的 ets 函数。

下面是列表 dat.list 每个列表都有时间序列,称为 zlam

## Create Dummy list
##Time series -> z, lambda - > lam
z <- ts(matrix(rnorm(30,10,10), 100, 3), start = c(1961, 1), frequency = 12)
lam <- 0.8
ap <- list(z=z,lam=lam)


z <- ts(matrix(rnorm(30,10,10), 100, 3), start = c(1971, 1), frequency = 12)
lam <- 0.5
zp <- list(z=z,lam=lam)

dat.list <- list(ap=ap,zp=zp)

现在我需要获取每个时间序列 z 并获取 lam 并使用 forecast 包中的 ets 函数应用它。我使用了以下代码。

library("forecast")
library("plyr")   
ets.f <- function(x) {
      forecast(ets(x$z, lambda = x$lam),h=12)$mean ## I need to apply lambda from list lam
    }

    ens.f <- function(x){
      mm <- llply(x,ets.f)
      tq <- matrix(unlist(mm), ncol = 12, byrow = TRUE)
      tq
    }

    fore <- llply(dat.list, ens.f)

当我运行程序时,我收到以下错误"Error in x$z : $ operator is invalid for atomic vectors"

我不确定如何应用列表的各个元素并将其应用到函数中。任何帮助将不胜感激。

非常感谢

此外,我还尝试在列表中将zlam 分开,但一直不知道如何应用它。我也愿意使用下面的代码。非常感谢。

ts.l <- lapply(dat.list,'[[','z')
lam.l <- lapply(dat.list,'[[','lam')

【问题讨论】:

    标签: r list lapply sapply tapply


    【解决方案1】:

    这可能会有所帮助:

    lapply(dat.list, function(x) matrix(unlist(lapply(x$z,
               function(y) forecast(ets(y, lambda=x$lam), 
                            h=12)$mean)), ncol=12, byrow=TRUE))
    

    【讨论】:

    • 谢谢@akrun,这正是我想要的。
    • @forecaster 没问题。很高兴它有帮助。
    • 嗨@akrun,因为我有很多1000个矩阵,我正在考虑并行运行它。如果您可以在两个实例中使用包snow 修改上面的代码以从 lapply 更改为 parLapply,那就太好了。我也可以提出一个单独的问题。非常感谢
    • @forecaster 最好将其作为一个单独的问题。
    • 感谢 akrun,我刚刚发布了它,我很想听听您的想法。谢谢
    猜你喜欢
    • 2019-05-26
    • 2012-05-20
    • 1970-01-01
    • 2015-02-09
    • 1970-01-01
    • 2014-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多