2013-04-16 4 views
3

으로 설정합니다. 행렬 당 함수를 수행하고자하는 행렬 (origmatrix)이 있습니다. 이 함수의 결과를 다른 행렬 (newmatrix)에 넣고 싶습니다.이 행의 행 번호는 원래 행렬의 열 번호와 일치합니다. 실제 데이터 세트에는 복잡한 함수가있는 20000 개의 행이 있으므로 프로젝트를 병렬화 할 수 있도록 적용 유형을 사용하고 싶습니다. 해당 애플리케이션 내에서 데이터를 newmatrix로 가져올 수있는 방법이 있습니까? 어떤 도움이라도 대단히 감사하겠습니다!행렬의 값을 병렬 sapply 내에서 R

origmatrix = matrix(1:50, 10, 5) 
colnames(origmatrix) = letters[1:5] 
newmatrix = matrix(0, 5,2) 
colnames(newmatrix) = c("Identifier","mean") 

boertje = function (x){ 
    newlist[which(colnames(origmatrix)==x),2]= mean(origmatrix[,x]) 
} 
sapply(colnames(origmatrix), boertje) 

답변

5

어떻게 parallel:::mclapply 또는 multicore:::mclapply는 플랫폼에 따라됩니다 lapply의 멀티 코어 버전을 사용하고 결과를 밖으로 dataframe을 어떻습니까?

require(parallel) 
res <- mclapply(1:ncol(origmatrix) , mc.cores = 1 , function(x){ c(mean(origmatrix[,x]) , sd(origmatrix[,x]) , var(origmatrix[,x])) }) 

# So the first element of the resulting list looks like 
res[[1]] 
    # [1] 5.500000 3.027650 9.166667 

df <- as.data.frame(res) 
rownames(df) <- c("mean","sd","var") 
colnames(df) <- colnames(origmatrix) 
#    a   b   c   d   e 
# mean 5.500000 15.500000 25.500000 35.500000 45.500000 
# sd 3.027650 3.027650 3.027650 3.027650 3.027650 
# var 9.166667 9.166667 9.166667 9.166667 9.166667 

mclapply 비록 도움말 페이지에서이 경고와 함께 오는가


이 강하게에 권장하지 않습니다 경고 ... : 당신과 같이 여러 값을 반환 할 때 당신은 dataframe을 만들 수 있습니다 GUI 또는 임베디드 환경에서 이러한 기능을 사용하십시오. 여러 프로세스가 동일한 GUI를 공유하기 때문에 혼란을 야기 할 수 있습니다 (충돌 가능성이 있음). 하위 프로세스는 화면상의 그래픽 장치를 사용해서는 안됩니다.

+0

내 기능에서 반환 된 값이 1 개일 때 우수합니다. 내 함수가 3 개의 값 tho (이 경우, 샌드위치 패키지의 coeftest)를 반환해야 할 때 작동하지 않는 것 같습니다. 나는'newmatrix [, 2 : 5] = unlist (...)'를 사용해 보았지만 그 중 하나는 효과가없는 것으로 보인다. – Xizam

+0

@ Xizam 아마도 함수에서 값이 반환되는 방법 (3 개의 값 목록)을 보여주기 위해 질문을 업데이트 할 수 있습니다. 값이 여러 개인 경우 각 값을 별도의 열에 표시 하시겠습니까? 나는 당신을위한 해결책을 추측하고 싶지 않다. 반환 값의 구조를 명시 적으로 표현할 수 있다면 더 좋을 것이다! :-) –

+0

@Xizam 업데이트했습니다. 아마도 편집이 문제를 해결할 것입니까? –