2014-01-13 3 views
1

apply 함수 집합 중 하나를 사용하여 일부 계산을 수행하고 싶습니다.대칭 행렬에 R 함수 적용

우선, I는 두 행렬 mat1mat2 가지고

mat1 :

a b c 
1 NA NA NA 
2 1 1 1 
3 1 1 NA 
4 NA 1 NA 

mat2 :

 a b c 
a 1.0 0.2 0.3 
b -0.7 1.0 0.8 
c -0.1 -0.3 1.0 

mat2 여기 무관 함수를 사용 mat1을 사용하여 계산된다 본질적으로 나는 가중치를 적용하고 싶다. g 기능을 mat1으로 설정하면 데이터가 적어서 정확도가 떨어지는 경우 mat2의 결과에 불이익을줍니다.

그래서 이것을 달성하려면 x,ymat2을 입력하고 mat1의 두 열의 쌍 완전성을 계산합니다. 예를 들어

: mat2["a","b"] 또는 mat2["b","a"]은 (동일 함) * (amat1b의 전체 행/amat1b 총 행)을 원래 값이 될 것이다.

정말 궁금한 점은 모든 열 (더블 루프)마다 모든 열을 반복하는 행렬에 함수를 적용하여 이것을 가중치 행렬에 저장하여 다른 행렬에 곱하는 방법입니다.

나는 이미 같은 zoo 패키지에서 rollapply을 사용하여 두 행을 비교할 수 있습니다

rowSums(rollapply(is.na(t(mat1)), 2, function(x) !any(x))) 

를 내가 얻을 :

[1] 2 1 

을로, A와 B를 비교, 2 행은 완전하고 비교 B에서 그리고 c, 1 행이 완료되었습니다. 그렇다면 어떻게 a를 b, a와 c, b를 c와 비교할 수 있습니까?

감사합니다.

답변

2

내가 다시 질문을보고되었고, 당신이 X[i,j]mat1[,c(i,j)]에 전체 경우의 수에 의해 주어진다 mat2, 같은 크기로 매트릭스 X을 할 것으로 보인다. 그런 다음 mat2X을 곱합니다.

완전한 사례 수는 sum(complete.cases(mat1[,c(i,j)]))입니다. 나는 벡터화 기능을 필요로 outer이를 사용하려면, 그래서 이것은 Vectorize을 통해 전달됩니다

outer(seq(nrow(mat2)), seq(ncol(mat2)), 
     Vectorize(function(x,y) sum(complete.cases(mat1[,c(x,y)]))) 
) 
##  [,1] [,2] [,3] 
## [1,] 2 2 1 
## [2,] 2 3 1 
## [3,] 1 1 1 

이 원하는 대칭 행렬이다.

+0

감사합니다. 정확하게 내가 찾고 있던 것이 었습니다! –