2014-01-13 27 views
1

我想利用apply函數集中的一個來做一些計算。R在對稱矩陣上應用函數

首先,我有兩個矩陣,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

我是看着你的問題又來了,似乎你想要的mat2,其中X[i,j]是由完整的病例數在mat1[,c(i,j)]給出了相同尺寸的矩陣X。然後mat2將乘以X

完整病例的數量由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

謝謝,正是我一直在尋找的! –