让你拥有以下数组
vec_1 <- c('a','b','c')
vec_2 <- c('d','e','f')
vec_3 <- c('g','h','i')
vec_4 <- c('l','m','n')
在矩阵X
中,如下所示:
X <- matrix(c(vec_1, vec_2, vec_3, vec_4), nrow = 3, byrow = FALSE)
等于
> X
[,1] [,2] [,3] [,4]
[1,] "a" "d" "g" "l"
[2,] "b" "e" "h" "m"
[3,] "c" "f" "i" "n"
我想使用 for()
循环来获取以下矩阵 D
:
D <- matrix(c('a - d', 'b - e', 'c - f',
'a - g', 'b - h', 'c - i',
'a - l', 'b - m', 'c - n',
'd - g', 'e - h', 'f - i',
'd - l', 'e - m', 'f - n',
'g - l', 'h - m', 'i - n'),
nrow = 3, byrow = FALSE)
如您所见,它是由每个 X
列的交叉差组成的:
> D
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] "a - d" "a - g" "a - l" "d - g" "d - l" "g - l"
[2,] "b - e" "b - h" "b - m" "e - h" "e - m" "h - m"
[3,] "c - f" "c - i" "c - n" "f - i" "f - n" "i - n"
在我的根本问题中,每个字母都是一个数值。
如何使用 for()
循环实现此结果?
如果对回答问题有用,请将每个字母替换为随机数字,您不需要为 paste()
疯狂!
最佳答案
这会成功......
m <- matrix( 1:12 , nrow = 3 , byrow = FALSE )
# [,1] [,2] [,3] [,4]
#[1,] 1 4 7 10
#[2,] 2 5 8 11
#[3,] 3 6 9 12
t( apply( m , 1 , function(x) { tmp <- t( outer(x,x,"-") ) ; tmp[ lower.tri(tmp) ]} ) )
# [,1] [,2] [,3] [,4] [,5] [,6]
#[1,] -3 -6 -9 -3 -6 -3
#[2,] -3 -6 -9 -3 -6 -3
#[3,] -3 -6 -9 -3 -6 -3
一定有很多更好的方法来实现这一点,但我现在想不出它们。基本上,我们在数字矩阵中逐行计算outer
差异。我们转置(以处理按列填充矩阵的事实),然后从结果中提取下三角形。
关于r - 使用 for 循环创建互差矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17423316/