2016-05-31 2 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) 
관련 문제