2017-06-13 69 views
1

我試圖在幾個列表中同時循環。但是,我正在使用幾個for-loops來達到所需的結果。我想知道是否有更好,更有效的方法來做到這一點。有效地在幾個列表中循環,而不在R中創建循環x

這裏是我的代碼

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? 將結果存儲在一個列表中也會非常有幫助,因此任何建議都非常值得歡迎。

回答

3

這將產生與最後一列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) 

查看它們。您也可以將它存儲在某個地方以便引用它。

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)