2

次の配列を用意します

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()

4

1 に答える 1

2

これはトリックを行います....

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、数値行列全体で行ごとに差を計算します。転置し (行列を列方向に埋めたという事実に対処するため)、結果から下三角を抽出します。

于 2013-07-02T11:27:07.620 に答える