2013-11-23 3 views
2

나는 R 프로그래밍에 익숙하지 않고 이것을하기 위해 루프를 작성할 수 있다는 것을 알고있다.하지만 내가 읽는 모든 것은 단순함을 위해 루프를 피하고 대신에 적용하는 것이라고 말한다.mapply - 인자의 행과 열을 인자로 넘겨 준다.

나는 행렬을 가지고 있으며이 행렬의 각 요소에 대해이 함수를 실행하려고합니다.

cellresidue <- function(i,j){ 
    result <- (cluster[i,j] - cluster.I[i,] - cluster.J[j,] - cluster.IJ)/(cluster.N*cluster.M) 
    return (result) 
} 

i= element row 
j= element column 
cluster.J is a matrix of column means 
cluster.I is a matrix of row means 
cluster.IJ is the mean of the entire matrix named cluster 

내가 요소의 행과 열을받을 수 있나요 어떻게 mapply이 작업을 어떻게 통과 할됩니다 (내가 행() 및 열 COL() 함수를 사용한다고 생각)한다 나는 알아낼 수 없습니다 무엇 mapply하거나 적용하는 그 의논?

+0

'chisq.test'에있는 코드를 읽으면 마스터가 비슷한 과정을 수행하는 방법을 알 수 있습니다. –

답변

0

루프 또는 *apply 기능이 필요하지 않습니다. 당신은 그냥 일반 행렬 연산을 사용할 수 있습니다

nI <- nrows(cluster) 
nJ <- ncols(cluster) 
cluster.I <- matrix(rowMeans(cluster), nI, nJ, byrow = FALSE) 
cluster.J <- matrix(rowMeans(cluster), nI, nJ, byrow = TRUE) 
cluster.IJ <- matrix( mean(cluster), nI, nJ) 

residue.mat <- (cluster - cluster.I - cluster.J - cluster.IJ)/
       (cluster.N * cluster.M) 

당신이 뭘 하려는지 질문에서 명확하지 않다

+1

'cluster.I'와'cluster.IJ' 구조를 건너 뛰고'rowMeans (.)'와'mean (.) '을 사용하고 R 인자의 재활용을 사용했을 수 있습니다. –

+0

예, 필자는 가능한 한 내 코드를 대칭으로 만들어 읽기 쉽도록 유지하는 편을 선호합니다. 성능이 저하되지는 않을 것입니다. 이것은 필요하지 않은 여분의 공간과 같습니다.하지만 모든 것이 더 깨끗해집니다. – flodel

+0

동의하십시오. 경제를 더 염려하는 사람들이 코드를 읽을 때 편리 할 수있는 약간의 지식을 추가하려고합니다. –

0

(당신은 cluster.Ncluster.M이 무엇인지 설명하지 않았지만 나는 그들이 스칼라 있다고 가정). 이 사이트에서 일부 모의 데이터 (코드에 의해 생성되고 붙이지 않음)를 제공 한 다음 최종 결과가 어떤 모양인지 보여주는 것이 가장 좋습니다. apply 가족은 당신이 추구하는 것이 아닙니다. sapply 및 mapply 적용 사이

빠른 명료화 :

#providing data for examples 
X=matrix(rnorm(9),3,3) 

을 적용하거나 컬럼에 함수를 적용 (2) 또는 행 (1) 매트릭스 또는 어레이

#here, sum by columns, same as colSums(X) 
apply(X, 2, sum) 

sapply : (일반적으로) 객체 목록에 대해 함수 적용

#create a list with three vectors 
mylist=list(1:4, 5:10, c(1,1,1)) 
#get the mean of each vector 
sapply(mylist, mean) 

#remove 2 to each element of X, same as c(X-2) 
sapply(X, FUN=function(x) x-2) 

mapply : 임의의 수의 인수를 사용하는 sapply의 다 변수 버전. 절대로 사용하지 마십시오 ... 일부 바위 바닥 예제 :

#same as c(1,2,3,4) + c(15,16,17,18) 
mapply(sum, 1:4, 15:18) 

#same as c(X+X), the vectorized matrix sum 
mapply(sum, X, X) 

사이드 노트 : R에 루프를 사용하는 것이 완벽하게 좋습니다. 자신의 생각에 가장 적합한 것을 사용하십시오. 문제는 "실제로 큰"반복 횟수가있는 경우 인내심에 따라 병목 현상을 해결할 수있는 곳입니다. 이에 대한 해결책은 두 가지입니다. C/FORTRAN에서 함수를 다시 작성하고 속도를 올리거나 적용 가능한 경우 내장 함수를 사용하십시오 (C 또는 FORTRAN에서 종종 작성됩니다).

관련 문제