2014-07-09 2 views
2

나는 N이라는 확률의 큰 행렬 (A라고 부름)을 가지고 있는데, N은 일반적으로 수천의 숫자이다.r - 매트릭스를 반복하고 각 요소에 값을 계산하고 할당하는 빠른 방법?

이 행렬을 사용하여 이진 값만 포함하는 다른 행렬 (B라고 함) (N은 806)을 작성하려고합니다. B [i, j]의 값은 이항을 통해 A [i, j]의 해당 확률을 사용하여 결정됩니다. I가 사용하고있는 코드는 아래와 같다 : 기본적

diCases <- matrix(0, nrow = numcases, ncol = numdis) 
diConts <- matrix(0, nrow = numconts, ncol = numdis) 

for(row in 1:nrow(diCases)) { 
    print(paste('Generating disease profile for case', row, '...')) 
    for(col in 1:ncol(diCases)) { 
     pDis <- Pcases[row, col] 
     diCases[row, col] <- rbinom(1, 1, pDis) 
    } 
} 

for(row in 1:nrow(diConts)) { 
    print(paste('Generating disease profile for control', row, '...')) 
    for(col in 1:ncol(diConts)) { 
     pDis <- Pconts[row, col] 
     diConts[row, col] <- rbinom(1, 1, pDis) 
    } 
} 

, I는 1 또는 0 결과에 기초하여 할당, 각 행의 모든 ​​열을 반복하여 다음 행으로 이동하는, 루프 중첩 사용에 의존 한 of :

rbinom(1, 1, pDis) 

여기서 pDis는 처음에 언급 한 A [i, j]입니다. 상상할 수 있듯이 이것은 매우 느리고 코드에서 주요 병목입니다. 이 코드 블록은 시뮬레이션을 통해 내가 단기간에 이상적으로 반복해서 실행하도록 계획 한 것입니다.

더 빠른 방법이 있습니까? 필자는 "적용"기능을 살펴 보았지만 실제로이 특정 작업을 수행하는 방법을 알지 못했습니다.

감사합니다. 각 번호에 들어가는 휴대폰 번호를 알고있는 경우

+0

을 시도, 당신은 어떤 루프 (또는'apply'ing)없이 직접 할당 할 수 있습니다. 당신의'pDis'는 무엇입니까? –

+0

pDis는 행렬 A의 해당 확률이며 행렬 B의 이진 값을 계산할 때 사용합니다. konvas가 제안한 전체 행렬에서'rbinom'을 호출 할 수 있다는 것을 알지 못했습니다. 그리고 그것은 아름답게 작동했습니다. – user3821273

답변

4

f <- function(prob.mat) 
    matrix(rbinom(prob.mat, 1, prob.mat), ncol = ncol(prob.mat)) 

diCases <- f(Pcases) 
diConts <- f(Pconts) 
+0

감사합니다. 중첩 된 for 루프를 사용하는 것은 확실히 우아한 대안입니다. 그러나 달리는 데 걸리는 시간은 같아 보입니다. 속도를 높이는 방법이 있습니까? – user3821273

+0

Doh, 내가 이것을 복잡하게 만들었던 것을 결코 생각하지 마라. 'rbinom'을 직접 호출 할 수 있습니다 ... – konvas

+0

'rbinom'을 직접 호출하면 완벽하게 작동합니다. 정말 고마워. 속도 증가가 벡터화 때문인 것 같네요? – user3821273

관련 문제