2016-05-31 6 views
0

次のコードがあります。唯一の最後の繰り返しデータが期待されているselect_outputに滞在している現在のシナリオではRプログラミング:実行中のネストループ内のデータフレームにデータを追加する

for(i in seq(from=1, to=8, by=1)) #i is number of stocks from a list 
    { 
     for(j in seq(from=1, to=8, by=1)) #j is number of trading days from another list 
     { 
      ## Matching bid and ask prices of each stock for each date and update temp_table 
      select_output <- sqldf("select * from temp_table where FLAG == 'new' ") 
     } 
    } 

。私はファイルを開いたままにして、すべての反復のデータを取り込みたいと思っています。私はselect_outputにデータを挿入するために別のループを使用したくありません。 Rで可能な方法は他にありますか?可能であればお勧めします。

ありがとうございます。

答えて

1

一つの選択肢は、expand.gridを組み合わせて適用し、私はこれが実際にR弱点だと思う

index <- expand.grid(
    i = 1:8, 
    j = 1:8 
) 
results <- apply(index, 1, function(x){ 
    x["i"] # holds i 
    x["j"] # holds j 
    sqldf("select * from temp_table where FLAG == 'new' ") 
}) 
do.call(rbind, results) 
+0

いいえ入れ子になったループの中にはさらに多くの操作があります。そうすれば、これは不可能です。私はiとjの位置に基づいて他のデータフレームからデータを取得しています。ネストされたループをそのままにしておくと、 'select_output'にデータを追加する際に何か提案することができます。 – Zico

+1

'x [" i "]'と 'x [" j '] 'を使って、' apply'内の関数内で他の操作を行うことができないのですか? – dash2

0

do.callすることです。行うための最善のことは、おそらくです:

results <- data.frame(a=numeric(0), b=character(0), ...) # whatever columns you expect 
for(i in 1:8) for(j in s1:7) { 
     ## Your code... 
     select_output <- sqldf("select * from temp_table where FLAG == 'new' ") 
     results <- rbind(results, select_output)  
} 

ここでの問題は、あなたがresultsの形式を指定するには、事前に必要があるということです。これは良いことです - それはあなたがあなたが望むものを明示的に述べるようにし、それらの期待に違反した場合はエラーを出すでしょう。しかし、データフレームを一緒にバインドする素早い方法があればうれしいでしょう。たぶん、ハドレーバースには解決策がありますか?

+0

rbind()またはc()悪い考え – Thierry

+0

当分の間、それは働いているようです – Zico

0

ここに別の解決策があります。

results <- lapply(1:8, function(i){ 
    #do some stuff with i 
    output <- lapply(1:8, function(j){ 
    #do some stuff with j based on the stuff with i 
    }) 
    do.call(rbind, output) 
}) 
do.call(rbind, results) 
関連する問題