2017-01-02 10 views
0

forループをapplyのループを既存のRスクリプトに置き換えようとしました。それにもかかわらず、私の古い関数は、return(list(df1,df2))のような複数のdataFramesリストを返します。いくつかの詳細については、例を以下に示す: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()*は何ですか?そしてそれらは、最初の機能ではなく配列である2つの全く異なるデータ構造のデータフレームです。 – Parfait

+0

申し訳ありませんが、私の例は表現力がありません。私は変換されたdataFrame上で2つの異なる計算のために入力データフレームと 'action1'と' action2'とで異なるアクションに '... 'を使いました。私は '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, ...)は次にrbindに同じ位置からのすべてのデータフレームを渡すMapの引数としてlapplyによって返されるすべてのリストを渡します。すべてdf1が一緒に結合され、全てdf2が一緒に結合される。

+0

私はテストして実行します。 Psidomに感謝します。 –

関連する問題