我有两个矩阵。矩阵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中循环公式
答案 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的重用规则中。