【问题标题】:Apply a function to objects in my global environment R将函数应用于我的全局环境 R 中的对象
【发布时间】:2021-06-29 16:33:36
【问题描述】:

此代码块根据 alpha 的长度创建 10 个对象。

alpha <- seq(.1,1,by=.1)

for (i in 1:length(alpha)){
  assign(paste0("list_ts_ses_tune", i),NULL)

}

如何将每个函数放入我创建的新 list_ts_ses_tune1 ... null 对象?每个函数都放在一个列表中,如果我设置 list_ts_ses_tune1 就可以工作

for (i in 1:length(alpha))
  {
  list_ts_ses_tune[i] <- lapply(list_ts, function(x) 
forecast::forecast(ses(x,h=24,alpha=alpha[i]))) 
  list_ts_ses_tune[i] <- lapply(list_ts_ses_tune[i], "[",  c("mean"))
}

也许这是一个更好的方法?我需要一个值列表中的每个单独的输出。

编辑:

for (i in 1:length(alpha))
 {
 list_ts_ses_tune[[i]] <- lapply(list_ts[1:(length(list_ts)/2)], 
function(x) 
forecast::forecast(ses(x,h=24,alpha=alpha[i]))) 
 list_ts_ses_tune[[i]] <- lapply(list_ts_ses_tune[[i]], "[",  c("mean"))

}

【问题讨论】:

    标签: r data-manipulation


    【解决方案1】:

    我们可以使用mget将所有对象返回到list

    mget(ls(pattern = '^list_ts_ses_tune\\d+'))
    

    此外,可以更轻松地创建 NULL list,而不是在全局环境中创建 10 个对象

    list_ts_ses_tune <- vector('list', length(alpha))
    

    现在,我们可以使用 OP 的代码了

    for (i in 1:length(alpha))
      {
      list_ts_ses_tune[[i]] <- lapply(list_ts, function(x) 
    forecast::forecast(ses(x,h=24,alpha=alpha[i]))) 
      
    }
    

    如果我们想创建一个单独的data.frame

    for(i in seq_along(alpha)) {
        list_ts_ses_tune[[i]] <- data.frame(Mean = do.call(rbind, lapply(list_ts, function(x)
               forecast::forecast(ses(x,h=24,alpha=alpha[i]))$mean)))
    }
    

    【讨论】:

    • 这个解决方案很棒。谢谢
    • 好的,我会的。一个要跟进的问题,如果我想为每个元素循环并希望将其作为列放入数据框中?例如 list_ts_ses_tune[[1]][[1]] 是一个输出,我想要 list_ts_ses_tune[[1]][[2]] 等的所有值。然后 list_ts_ses_tune[[2]][[1 ]] 等都作为唯一的数据框列。我该怎么做?
    • @chriswang123 您是否尝试提取mean 列并创建一个data.frame
    • 是的,要访问每个输出,我需要执行 list_ts_ses_tune[[1]][[1]],其中 [[1]] =alpha 而第二个 [[1]] 是平均列.我希望所有平均输出到一个数据帧中
    • 这几乎是完美的。问题是 dfs 是 8 rows by 24 。我希望它是 24 行的长度(alpha)。还有没有办法将手段放入现有的数据框中?
    【解决方案2】:

    您可以通过以下方式简单地完成所有事情:

    library(forecast)
    list_ts_ses_tune <- Map(function(x) 
                           lapply(alpha, function(y)forecast(ses(x,h=24,alpha=y))['mean']), list_ts) 
    

    【讨论】:

    • 我得到这个错误,“更长的参数不是更短长度的倍数”。 list_ts 是一个时间序列列表,在我的数据中只有 8 个元素
    猜你喜欢
    • 2019-12-16
    • 2022-11-02
    • 2018-10-27
    • 2018-05-04
    • 2016-03-27
    • 2020-07-24
    • 2017-12-30
    • 1970-01-01
    • 2022-01-04
    相关资源
    最近更新 更多