2

言語Rのペアワイズ インデックスによって、対称行列の下三角ベクトルにインデックスを付ける方法を探しています。ここにいくつかの説明コードがあります:

バックグラウンド

Mここではランダムなデータを使用しnnペアごとの行列です(表示するだけです):

n <- 5
set.seed(0815)
M <- matrix(sample(n^2),n,n)
M[upper.tri(M)] <- t(M)[upper.tri(M)]
diag(M) <- 0
M

#      [,1] [,2] [,3] [,4] [,5]
# [1,]    0    6    3   18   10
# [2,]    6    0   11   23    9
# [3,]    3   11    0    5   21
# [4,]   18   23    5    0   16
# [5,]   10    9   21   16    0

データ

私のデータ ( x) は、行列の下三角ベクトルMです。

x <- M[lower.tri(M)]

抽出したいインデックス ペアは、次の名前のベクトルに格納されiます。

i <- c(2:3,5)

標的

私の目的は、次の行列の例のように、下三角ベクトルからペアを抽出することです。

aim <- M[i,i][lower.tri(M[i,i])]
aim
# [1] 11  9 21

私の解決策

私の場合Mは利用できず、(メモリの問題)から生成したくないのでx、次のインデックス関数を作成しましたf

f <- function (n,i) {
  r <- combn(i,2)[1,]
  c <- combn(i,2)[2,]
  n * r + c - (r * (r + 1))/2 - n
}

結果

res <- x[f(n,i)]
identical(res, aim)
# [1] TRUE

最後に、私の質問:

関数 の R には、より洗練された、または既に組み込まfれているバージョンがありnますxか?

前もって感謝します。

スヴェン

4

2 に答える 2

0

これをもう一度見た後、私はあなたがただしなかったことに困惑しています:

x[i]
#[1]  3 18 11

中間値を割り当てたくない場合は、x次を使用できます。

M[lower.tri(M)][i]
#[1]  3 18 11
于 2014-08-09T01:09:40.770 に答える