【问题标题】:To create a cross-difference matrix with for-loop使用 for 循环创建交叉差分矩阵
【发布时间】:2013-06-29 16:28:39
【问题描述】:

让你有如下数组

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()发疯!

【问题讨论】:

  • 你只是想得到paste("column", 1:N)吗?
  • 如果你定义了你需要这样一个解决方案的潜在问题,你可能会得到一个很好的答案。就其本身而言,@Thomas 已经告诉了你所有你需要知道的......(paste("column", 1:(N+3))
  • 我不是,因为根据我的计算,标有"column x"的行数应该是N * (N - 1) / 2
  • 那你的问题还不清楚。例如,它提到了矩阵,但没有提供任何矩阵。
  • 好的,我将编辑问题向您展示整个问题。

标签: r for-loop indexing


【解决方案1】:

这样就可以了....

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 差异。我们转置(以处理您按列填充矩阵的事实),然后从结果中提取下三角形。

【讨论】:

  • 它可能会稍微快一点,尤其是。在一个大矩阵上,有function(x) { tmp &lt;- outer(x,x,"-") ; rev(tmp[ upper.tri(tmp) ])}
  • 好东西,考虑到apply() 就像for() 循环的包装器,我认为它完全符合主题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-06-12
  • 1970-01-01
  • 1970-01-01
  • 2013-06-25
  • 2022-01-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多