r - 使用 for 循环创建互差矩阵

标签 r for-loop indexing

让你拥有以下数组

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/

相关文章:

mysql - Magento CE 2.2 巨大的目录索引问题

mysql - 优化 MySQL 查询,耗时将近 20 秒!

r - 模型摘要中有序和无序因子与数值预测变量的解释

python - 如何阻止值返回 'None' ?

java - 如何按特定顺序打印二维数组的某些部分?

r - 获取向量的最后 n 个元素。有没有比使用 length() 函数更好的方法?

r - 使用 dplyr 根据分组变量计算列 NA

r - 如何将观察值乘以先前的观察值,但前提是某个条件为真

r - 使用 R 中的 multhist 创建具有多个数据系列的直方图

javascript使用for循环从多个字符串中删除字符