2016-06-07 64 views
1

我有兩個矩陣。基質1和基質2通過ID匹配多個矩陣,並遍歷列ID循環功能

矩陣1

 id1 id2 id3 id4 id5 
row1 0.4 0.5 0.2 0.1 0.3 
row2 1.1 1.2 1.5 0.8 1.0 

矩陣2

 id1 id2 id3 id4 id5 
row1 0 2.1 2 1 2 
row2 1  1 2 3 3 
row3 3 3.2 3 2 1 

我想執行以下

  • 首先,導致一個矩陣3具有與矩陣1相同的IDS,但只包含第1行。

  • 其次,結果矩陣4,其是基質1和整個矩陣2.

Matrix3

id1 id2 id3 id4 id5 
row1 0.4 0.5 0.2 0.1 0.3 

矩陣4

id1 id2 id3 id4 id5 
row1 0 2.5 3 0.8 2 
row2 1.1 1.2 3.0 2.4 3 
row3 3.3 3.8 4.5 1.6 1 

的ROW2的以下一種產品,我會喜歡根據ID匹配兩個矩陣(矩陣3和矩陣4)並運行以下公式:

(1-matrix3$id)^2 + 2*(matrix3$id)*(1-matrix3$id)*(matrix4$id)+(matrix3$id)^2*(matrix4$id)^2 

我想循環公式在所有的ID請

+0

@RHertel矩陣4是矩陣1和矩陣2的第2行的乘積,即我將從矩陣1中提取第2行並生成矩陣2的結果矩陣的乘積。 –

+0

我將編輯查詢的後半部分使其更清晰)在評論部分,並保持不變的問題。謝謝 –

+1

好的,我明白了。 'm4 < - t(t(m2)* m1 [2,])'是另一種選擇。我現在已經看到它在@AEBilgrau答案中也提到過。 – RHertel

回答

2

對於第一個問題,另一個選擇

m3 <- m1[2,] 
m4 <- m2*m3[col(m2)] 
m4 
#  id1 id2 id3 id4 id5 
#row1 0.0 2.52 3.0 0.8 2 
#row2 1.1 1.20 3.0 2.4 3 
#row3 3.3 3.84 4.5 1.6 1 

基於猜測的第二個問題是

((1- m3)^2)[col(m4)] + (2*m3*(1- m3))[col(m4)] * m4 + (m3^2)[col(m4)] * m4^2 
#   id1  id2  id3 id4 id5 
#row1 0.0100 7.974976 16.0000 0.7056 4 
#row2 1.2321 1.537600 16.0000 4.4944 9 
#row3 12.4609 19.430464 39.0625 2.1904 1 

類似的結果與@ AEBilgrau的解決方案

t((1-mat3)^2 + 2*(mat3)*(1-mat3)*t(mat4) + (mat3)^2*t(mat4)^2) 
#   id1  id2  id3 id4 id5 
#row1 0.0100 7.974976 16.0000 0.7056 4 
#row2 1.2321 1.537600 16.0000 4.4944 9 
#row3 12.4609 19.430464 39.0625 2.1904 1 
+0

最後一位即@(1-matrix3 $ id)^ 2 + 2 *(矩陣3 $ id)*(1-矩陣3 $ id) *(matrix4 $ id)+(matrix3 $ id)^ 2 *(matrix4 $ id)^ 2,得到的矩陣與矩陣4具有相同的維數。 –

+0

@biostats_guy它與其他文章中的結果相同。 – akrun

3

關於第一個問題,你可以使用sweep

m3 = m1[2,] 
m4 = sweep(m2, m3, MARGIN=2, FUN="*") 
#  id1 id2 id3 id4 id5 
#row1 0.0 2.52 3.0 0.8 2 
#row2 1.1 1.20 3.0 2.4 3 
#row3 3.3 3.84 4.5 1.6 1 

但仍然還不是很清楚你所期望的作爲輸出由mentionning「爲所有ID」

+0

嗨,我的想法是,函數或公式將沿着所有列ID獨立循環。因此,我們最終會得到一個與矩陣4具有相同維數的矩陣。 –

2

了,我覺得你描寫的特徵有點難以跟隨。它是例如不清楚你想如何將矩陣3的1行應用到公式中矩陣4的行上。

如果

(1-mat$id1)^2 + 2*(mat3$id1)*(1-mat3$id1)*(mat4$id1)+(mat3$i1d)^2*(mat4$id1)^2 

爲您提供id1正確的結果,然後在繼上次的計算應該是正確的。

通過猜測填補空白,這是否給你你想要的?

# Load your data 
mat1 <- as.matrix(read.table(header = TRUE, text="id1 id2 id3 id4 id5 
row1 0.4 0.5 0.2 0.1 0.3 
row2 1.1 1.2 1.5 0.8 1.0")) 

mat2 <- as.matrix(read.table(header = TRUE, text="id1 id2 id3 id4 id5 
row1 0 2.1 2 1 2 
row2 1  1 2 3 3 
row3 3 3.2 3 2 1")) 

# Create matrix 3 
mat3 <- mat1["row1", ] 
print(mat3) 
#id1 id2 id3 id4 id5 
#0.4 0.5 0.2 0.1 0.3 

# Create matrix 4 (yet another option) 
mat4 <- t(t(mat2)*mat1["row2", ]) 
print(mat4) 
#  id1 id2 id3 id4 id5 
#row1 0.0 2.52 3.0 0.8 2 
#row2 1.1 1.20 3.0 2.4 3 
#row3 3.3 3.84 4.5 1.6 1 

# Compute results 
res <- t((1-mat3)^2 + 2*(mat3)*(1-mat3)*t(mat4) + (mat3)^2*t(mat4)^2) 
print(res) 
#  id1 id2 id3 id4 id5 
#row1 0.3600 3.0976 1.96 0.9604 1.69 
#row2 1.0816 1.2100 1.96 1.2996 2.56 
#row3 3.6864 5.8564 2.89 1.1236 1.00 

我們在這裏利用矩陣存儲在列 - 主要順序和R的重用規則。