R - 如何用方阵的下三角替换非方阵的下三角?
R - how do I replace the lower triangular of part of a non-square matrix with the lower triangular of a square matrix?
我在R中有两个矩阵,一个方阵,一个非方阵:
dataMatrix1,一个 5x5 矩阵:
1 2 3 4 3
2 1 3 5 7
3 3 1 1 8
4 5 1 1 5
1 7 8 5 1
dataMatrix2,一个 5x8 矩阵:
1 0.2 0.3 0.4 0.3 0.9 0.6 0.5
0.2 1 0.3 0.5 0.7 0.8 0.6 0.1
0.3 0.3 1 0.1 0.8 0.3 0.1 0.6
0.4 0.5 0.1 1 0.5 0.3 0.1 0.7
0.1 0.7 0.8 0.5 1 0.5 0.9 0.9
我想用 dataMatrix1 的下三角替换 dataMatrix2 的前 5x5 元素的下三角部分,所以我会得到以下矩阵:
1 0.2 0.3 0.4 0.3 0.9 0.6 0.5
2 1 0.3 0.5 0.7 0.8 0.6 0.1
3 3 1 0.1 0.8 0.3 0.1 0.6
4 5 1 1 0.5 0.3 0.1 0.7
1 7 8 5 1 0.5 0.9 0.9
我只是编造了这些矩阵的值以用作示例,我必须对几个矩阵执行此操作。有系统的方法来实现吗?
数据
m1 <-"
1 2 3 4 3
2 1 3 5 7
3 3 1 1 8
4 5 1 1 5
1 7 8 5 1"
m1 <- as.matrix(read.table(text=m1,h=F))
m2 <-"
1 0.2 0.3 0.4 0.3 0.9 0.6 0.5
0.2 1 0.3 0.5 0.7 0.8 0.6 0.1
0.3 0.3 1 0.1 0.8 0.3 0.1 0.6
0.4 0.5 0.1 1 0.5 0.3 0.1 0.7
0.1 0.7 0.8 0.5 1 0.5 0.9 0.9"
m2 <- as.matrix(read.table(text=m2,h=F))
您可以使用 lower.tri()
函数 - 它在两个矩阵上都能正常工作:
mat1 <- matrix(1:25, nrow=5)
mat2 <- matrix(rnorm(50), nrow=5)
这是 lower.tri
的结果:
> lower.tri(mat1)
[,1] [,2] [,3] [,4] [,5]
[1,] FALSE FALSE FALSE FALSE FALSE
[2,] TRUE FALSE FALSE FALSE FALSE
[3,] TRUE TRUE FALSE FALSE FALSE
[4,] TRUE TRUE TRUE FALSE FALSE
[5,] TRUE TRUE TRUE TRUE FALSE
> lower.tri(mat2)
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[2,] TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[3,] TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[4,] TRUE TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[5,] TRUE TRUE TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE
你可以用它来替换:
mat2[lower.tri(mat2)] <- mat1[lower.tri(mat1)]
mat2
> mat2
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 1.217691 0.3217439 1.2819224 -0.8618631 0.42995995 1.6090869 -0.01434864 1.4435626 -0.49071287 0.24014275
[2,] 2.000000 0.9499850 -0.8694622 -0.4298002 -0.18049240 -0.4742643 0.66824074 0.5185916 0.08725232 -0.38885167
[3,] 3.000000 8.0000000 -0.4522152 -1.1518328 -0.97425214 -0.1934794 -1.21050069 -0.3670091 -1.08416208 0.65378101
[4,] 4.000000 9.0000000 14.0000000 -0.7285091 -0.75610467 2.7866430 -0.63774276 -1.3474289 -0.25998202 1.57901406
[5,] 5.000000 10.0000000 15.0000000 20.0000000 -0.07180773 -0.5519527 0.29733510 0.7673501 -1.78309776 0.04265967
我在R中有两个矩阵,一个方阵,一个非方阵:
dataMatrix1,一个 5x5 矩阵:
1 2 3 4 3
2 1 3 5 7
3 3 1 1 8
4 5 1 1 5
1 7 8 5 1
dataMatrix2,一个 5x8 矩阵:
1 0.2 0.3 0.4 0.3 0.9 0.6 0.5
0.2 1 0.3 0.5 0.7 0.8 0.6 0.1
0.3 0.3 1 0.1 0.8 0.3 0.1 0.6
0.4 0.5 0.1 1 0.5 0.3 0.1 0.7
0.1 0.7 0.8 0.5 1 0.5 0.9 0.9
我想用 dataMatrix1 的下三角替换 dataMatrix2 的前 5x5 元素的下三角部分,所以我会得到以下矩阵:
1 0.2 0.3 0.4 0.3 0.9 0.6 0.5
2 1 0.3 0.5 0.7 0.8 0.6 0.1
3 3 1 0.1 0.8 0.3 0.1 0.6
4 5 1 1 0.5 0.3 0.1 0.7
1 7 8 5 1 0.5 0.9 0.9
我只是编造了这些矩阵的值以用作示例,我必须对几个矩阵执行此操作。有系统的方法来实现吗?
数据
m1 <-"
1 2 3 4 3
2 1 3 5 7
3 3 1 1 8
4 5 1 1 5
1 7 8 5 1"
m1 <- as.matrix(read.table(text=m1,h=F))
m2 <-"
1 0.2 0.3 0.4 0.3 0.9 0.6 0.5
0.2 1 0.3 0.5 0.7 0.8 0.6 0.1
0.3 0.3 1 0.1 0.8 0.3 0.1 0.6
0.4 0.5 0.1 1 0.5 0.3 0.1 0.7
0.1 0.7 0.8 0.5 1 0.5 0.9 0.9"
m2 <- as.matrix(read.table(text=m2,h=F))
您可以使用 lower.tri()
函数 - 它在两个矩阵上都能正常工作:
mat1 <- matrix(1:25, nrow=5)
mat2 <- matrix(rnorm(50), nrow=5)
这是 lower.tri
的结果:
> lower.tri(mat1)
[,1] [,2] [,3] [,4] [,5]
[1,] FALSE FALSE FALSE FALSE FALSE
[2,] TRUE FALSE FALSE FALSE FALSE
[3,] TRUE TRUE FALSE FALSE FALSE
[4,] TRUE TRUE TRUE FALSE FALSE
[5,] TRUE TRUE TRUE TRUE FALSE
> lower.tri(mat2)
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[2,] TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[3,] TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[4,] TRUE TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
[5,] TRUE TRUE TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE
你可以用它来替换:
mat2[lower.tri(mat2)] <- mat1[lower.tri(mat1)]
mat2
> mat2
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 1.217691 0.3217439 1.2819224 -0.8618631 0.42995995 1.6090869 -0.01434864 1.4435626 -0.49071287 0.24014275
[2,] 2.000000 0.9499850 -0.8694622 -0.4298002 -0.18049240 -0.4742643 0.66824074 0.5185916 0.08725232 -0.38885167
[3,] 3.000000 8.0000000 -0.4522152 -1.1518328 -0.97425214 -0.1934794 -1.21050069 -0.3670091 -1.08416208 0.65378101
[4,] 4.000000 9.0000000 14.0000000 -0.7285091 -0.75610467 2.7866430 -0.63774276 -1.3474289 -0.25998202 1.57901406
[5,] 5.000000 10.0000000 15.0000000 20.0000000 -0.07180773 -0.5519527 0.29733510 0.7673501 -1.78309776 0.04265967