2012-09-01 4 views
0

다음과 같이 for 루프를 중첩했습니다. 나는 p : q = 1 : 300, n = 20이 필요하다. 기능 "마크"는 내 관심 모델입니다 (패키지 RMark). 나는 rbind가 느릴 수 있지만 그것을 대체하기 위해 무엇을 사용해야하는지 전혀 모른다는 것을 알고 있습니다. 그렇지 않은 경우이 기능을 더 빠르게 수행하려면 무엇을 할 수 있습니까? 감사.R에서 중첩 된 for 루프를 용이하게하는 방법은 무엇입니까?

foo<-function(data, p, q, n){ 
results.frame <- data.frame() 
for (i in 1:n){ 
    for (i in p:q) { 
     run.model<-mark(data[sample(nrow(data), i),], model="Occupancy")  
     results<-data.frame(summary(run.model)$real$p, Occupancy=summary(run.model)$real$Psi, se.p=t(as.matrix(summary(run.model, se=T)$real$p$se)), se.Psi=summary(run.model, se=T)$real$Psi$se, stations=i) 
     results.frame<-rbind(results.frame, results) 
     } 
    } 
write.table(results.frame, "C:\\RWorkspace\\simulation_results.txt") 
return(results.frame) 
} 
+0

1) 당신은 results.frame''의 크기를 미리 할당하고 인덱싱하여 기입해야한다. 2)'data.frame()'이 정말로 필요한가 아니면'matrix()'만으로 충분할 것인가? 결과는 모두 숫자처럼 보이므로 행렬만으로 충분할 수 있습니다. 3)'cmpfun()'함수가'compiler' 패키지를 통해 여러분에게 어떤 자유 속도 충돌을 주는지 확인합니다. 4) 'mark()'함수가 base에없고, 당신의 질문이 [reproducible]이 아니므로 어디에서 오는 지 알려주세요. (http://stackoverflow.com/questions/5963269/how-to-make-a-great- r-reproducible-example). 사람들은 실제 조언을하기가 어려울 것입니다. – Chase

+0

1) 합리적인 것 같아서, 나는 그것을 시도 할 것이다. 2) 예, 모든 출력은 숫자이므로 matrix()로 전환합니다. 3)'cmpfun()'과'complier'를 살펴 보겠습니다. 4)'mark()'함수는 "RMark"패키지에서 가져옵니다. 이것은 동물 집단 역학을위한 것입니다. 제안 해 주셔서 감사합니다. – lamushidi

+1

또한 두 루프 모두에서 'i'를 사용하고 있습니다. 다른 변수를 사용하는 것이 더 좋으므로 루프 내부에서 원하는 'i'를 사용하고 있음을 확신 할 수 있습니다. – Aaron

답변

0

예, rbind은 느릴 수 있습니다. 일반적으로 행렬을 적당한 크기로 만들고 적절하게 채우는 것이 더 빠릅니다. 또한 대개 데이터 프레임 대신 매트릭스를 채우는 것이 더 빠릅니다.

그러나 표시된 크기로는 mark이 기능을 느리게하는 것이고 그렇게하면 속도가 현저히 떨어지는 것으로 생각됩니다. 단일 결과를 run.model에 저장하고 루프에서 해당 라인을 주석 처리하여 테스트하는 것은 쉽습니다. 그것은 단지 결과를 저장하는 데 소비하는 시간을 알려줍니다. (당신은 또한 함수를 "프로파일 링"할 수 있지만 이것은 더 간단 할 것입니다.)

편집 : 저는 실제로 잘못되었습니다. 당신이 나타내는 크기가 충분히 커서 rbind이 문제를 일으킬 가능성이 있습니다. 상당히 빠른 속도와 적당한 메모리 량을 가지고있는 시스템에서 n=20의 데이터 프레임과 n=1의 0.09 초만을 사용하여 rbind에 7.73 초가 걸리므로 일부 메모리 변동이 일어나고 있습니다. 속도 향상에 관해서는, n=20으로는 그것을 채우기 위해 단 1.00 초 rbind에 행렬과 0.033 초 걸립니다.

foo <- function(data, p, q, n){ 
    # make a single results line; remove this line when you put in your code 
    results <- c(1, Occupancy=2, se.p=3, se.Psi=4, stations=5) 
    # make the matrix the right size to start with 
    results.frame <- matrix(ncol=5, nrow=(q-p+1)*n) 
    for (i in 1:n){ 
    for (j in p:q) { 
     # get results here; commented out to show loop speed only 
     # put in your actual code here instead 
     results.frame[ 1+(i-1)*(q-p+1)+(j-p), ] <- results 
    } 
    } 
    # get the names right by taking the names from the last time through the loop 
    colnames(results.frame) <- names(results) 
    results.frame 
} 
+0

조언 해 주셔서 감사합니다. 먼저'p : q = 1 : 200'을'n '없이 쓰려고했는데 8 분 밖에 걸리지 않았습니다. 그런 다음 'n'에 대해 루프를 추가하고'p : q = 1 : 300, n = 20'을 실행하면 거의 5 시간이 걸립니다. 그래서 그것은'mark()'보다는 중첩 된 루프라고 생각했습니다. "내 루프에서 그 라인을 주석으로 처리하는 것"이란 무엇을 의미합니까? 나는 그것이 바보 같은 질문이라면 먼저 사과한다. 나는 전문 프로그래머가 아니며 여전히 배우고 있습니다. – lamushidi

+0

수정 한 코드를 사용하기를 기다릴 수 없습니다. 그러나 현재 시뮬레이션이 끝날 때까지 기다려야합니다. T_T – lamushidi

관련 문제