2016-06-07 57 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的重用规则。