在几个列表中有效循环,而不在R中创建x for循环

时间:2017-06-13 08:06:29

标签: r loops lapply

我试图在几个列表上同时循环。但是,我正在使用几个for循环来达到预期的结果。我想知道是否有更好,更有效的方法来做到这一点。

这是我的代码

for (i in list(3,6)){
  for (n in list("rmse.","mape.", "mpe.")){
    for (b in list("base.", "rev.")){
      a <- paste0(b, "fcst")
      c <- paste0(n, a)
      x <- paste0(c, i)
      print(x)
    }
  }
}

结果如下:

[1] "rmse.base.fcst3"
[1] "rmse.rev.fcst3"
[1] "mape.base.fcst3"
[1] "mape.rev.fcst3"
[1] "mpe.base.fcst3"
[1] "mpe.rev.fcst3"
[1] "rmse.base.fcst6"
[1] "rmse.rev.fcst6"
[1] "mape.base.fcst6"
[1] "mape.rev.fcst6"
[1] "mpe.base.fcst6"
[1] "mpe.rev.fcst6"

我很确定有一种更有效的方式,也许还有lapply? 将结果存储在一个列表中也非常有用,因此任何建议都非常受欢迎。

2 个答案:

答案 0 :(得分:4)

这将生成一个数据框,最后一列x就是您所需要的,

df = expand.grid(i = c(3,6),
             n = c("rmse.", "mape.", "mpe."),
             b = c("base.", "rev.")) %>%
mutate(x = paste0(n, b, "fcst", i))

只做

df %>% select(x)

查看它们。您也可以将它存储在某处以引用它。

答案 1 :(得分:2)

zz <- expand.grid(n,b,"fcst",i) 
do.call(paste0, zz)

# [1] "rmse.base.fcst3" "mape.base.fcst3" "mpe.base.fcst3"  "rmse.rev.fcst3" 
# [5] "mape.rev.fcst3"  "mpe.rev.fcst3"   "rmse.base.fcst6" "mape.base.fcst6"
# [9] "mpe.base.fcst6"  "rmse.rev.fcst6"  "mape.rev.fcst6"  "mpe.rev.fcst6" 

输入:

n <- c("rmse.","mape.", "mpe.")
b <- c("base.", "rev.")
i <- c(3,6)