我会尽力解释这一点。我有一个数据集,我从中创建一个matix并在其上执行tcrossprod,简化的示例数据集是......
key value
a1 1000
a2 500
a3 1500
a5 200
我的问题出现了,因为我有另一个矩阵,我想缩放我单独计算的原始矩阵,简化的例子是......
a1 a2 a3 a4 a5
a1 1 5 10 15 50
a2 5 1 20 25 75
a3 10 20 1 30 80
a4 15 25 30 1 100
a5 50 75 80 100 1
我希望将第二个矩阵映射到第一个矩阵,但我无法找到一种方法来实现它,我希望最终得到两个矩阵,我可以将它们相乘,例如,第一个矩阵就是结果对于trcrossprod,第二个矩阵是单独计算的。
这两个矩阵没有相同的尺寸,这就是为什么我要将第二个矩阵的相应值映射到与第一个矩阵相同的维度,所以我有一个简单的标量矩阵计算。
v1 v2 v3 v4 a1 a2 a3 a4 a5
1, 1000000 500000 1500000 200000 a1 1 5 10 50
2, 500000 250000 750000 100000 a2 5 1 20 75
3, 1500000 750000 2250000 300000 a3 10 20 1 80
4, 200000 100000 300000 40000 a5 50 75 80 1
所以第一个矩阵的键需要在正确的位置映射到第二个矩阵,这样我就可以对matrix_1 * matrix_2进行简单的缩放。
然后我会得到一个看起来像这样的新矩阵......
v1 v2 v3 v4
1, 1000000 2500000 15000000 10000000
2, 2500000 250000 15000000 7500000
3, 15000000 15000000 2250000 24000000
4, 10000000 7500000 24000000 40000
答案 0 :(得分:1)
# Reproduce data
df1 <- read.table(header = TRUE, text = "key value
a1 1000
a2 500
a3 1500
a5 200")
v1 <- as.matrix(df1[, 2, drop = FALSE])
rownames(v1) <- df1[[1]]
m1 <- v1 %*% t(v1)
# a1 a2 a3 a5
# a1 1000000 500000 1500000 2e+05
# a2 500000 250000 750000 1e+05
# a3 1500000 750000 2250000 3e+05
# a5 200000 100000 300000 4e+04
m2 <- as.matrix(read.table(header = TRUE, text = " a1 a2 a3 a4 a5
a1 1 5 10 15 50
a2 5 1 20 25 75
a3 10 20 1 30 80
a4 15 25 30 1 100
a5 50 75 80 100 1"))
m1 * do.call("[", c(list(m2), dimnames(m1)))
# a1 a2 a3 a5
# a1 1.0e+06 2.5e+06 15000000 1.0e+07
# a2 2.5e+06 2.5e+05 15000000 7.5e+06
# a3 1.5e+07 1.5e+07 2250000 2.4e+07
# a5 1.0e+07 7.5e+06 24000000 4.0e+04