2017-01-02 64 views
0

我試圖在existant R腳本中用apply循環替換for循環。儘管如此,我的舊函數返回多個數據框列表,如return(list(df1,df2))。對於一些細節,通過實例介紹如下:R應用返回列表的循環

舊腳本:

MyFunction = function(input){ 
    df1=array(NA,c(0,1)) 
    df2=array(NA,c(0,1)) 
    for(i in 1:n){ 
    ... 
    df1 = rbind(df1,action1(input)) 
    df2 = rbind(df2,action2(input)) 
    } 
return(list(df1,df2)) 

新的腳本:

Object = do.call(rbind, lapply(1:n,function(i){ 
    df1 = action1(input) 
    df2 = action2(input) 
    return(list(df1,df2)) 
})) 

我獲得:

 [,1] [,2] [,3] [,4] [,5] 
[1,] List,2 List,2 List,2 List,2 List,2 
[2,] List,2 List,2 List,2 List,2 List,2 
[3,] … 

我也沒辦法解決我的問題。任何幫助將不勝感激。

謝謝進步,

B.Gees

+0

什麼是* action1()*和* action2()*?這些不是第一個函數中的數據框,而是數組,兩個非常不同的數據結構。 – Parfait

+0

對不起,我的例子沒有表現力。我在輸入dataFrame和'action1'和'action2'中使用了'...'來對我轉換的dataFrame進行兩種不同的計算。我同意你關於'array'和dataFrame的區別,但是對於我來說,初始化dataFrame並通過第一個結果dataFrame的簡單串聯獲得好的列標題是一個簡單的解決方案。 –

回答

0

do.call(rbind, ...)通常用於行綁定數據幀/矩陣的列表。您有一個數據框列表列表,並且您想要相應地綁定它們,您可以嘗試以下模式。

Object = do.call(Map, c(f = rbind, lapply(1:n,function(i){ 
    df1 = action1(input) 
    df2 = action2(input) 
    return(list(df1,df2)) 
}))) 

do.call(Map, ...)經過lapply作爲參數傳遞給它Map然後從相同的位置上傳遞的所有數據幀到rbind返回的所有列表。即所有df1將被綁定在一起,並且所有df2將被綁定在一起。

+0

我測試並運行。非常感謝Psidom。 –