按ID匹配多个矩阵,并跨列ID循环一个函数

时间:2016-06-07 09:57:31

标签: r matrix

我有两个矩阵。矩阵1和矩阵2。

Matrix 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

Matrix 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

我想做以下

  • 首先,结果是Matrix 3与矩阵1具有相同的IDS,但只包含第1行。

  • 其次,结果矩阵4是矩阵1的第2行和整个矩阵2的乘积。

Matrix3

    id1 id2 id3 id4 id5
row1 0.4 0.5 0.2 0.1 0.3

Matrix 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

接下来我想基于ID匹配两个矩阵(矩阵3和矩阵4)并运行以下公式:

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

我想在所有ID中循环公式

3 个答案:

答案 0 :(得分: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

但是仍然很不清楚你所期望的输出是什么"所有ids"

答案 1 :(得分: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

答案 2 :(得分:2)

我发现你的描述有点难以理解。它是例如不清楚如何将1行矩阵3应用于公式中矩阵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的重用规则中。