2016-05-31 3 views
0

У меня есть следующий код.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, который, как ожидается. Я хочу сохранить файл открытым, чтобы заполнить его данными из всех итераций. Я не хочу использовать другой цикл для вставки данных в select_output. Есть ли другой способ в R? По возможности предложите.

Заранее спасибо.

ответ

1

один вариант заключается в объединении expand.grid, применяется и do.call

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

no У меня больше операций внутри вложенных циклов. Таким образом, это будет невозможно. Я беру данные из других фреймов данных на основе позиций i и j. Надеюсь, что если сохранить вложенную петлю в целости, вы можете предложить что-то добавить данные в 'select_output'. – Zico

+1

Почему вы не можете выполнять эти другие операции внутри функции в 'apply', используя' x ["i"] 'и' x ["j ']'? – dash2

0

Я думаю, что это на самом деле R слабое место. Самое лучшее, что нужно сделать, это, вероятно:

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. Это может быть хорошо - это заставляет вас четко указывать то, что вы ожидаете, и даст ошибку, если эти ожидания будут нарушены. Но было бы неплохо иметь быстрый способ связать фрейм данных. Может быть, у Hadleyverse есть решение?

+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)