言語Rのペアワイズ インデックスによって、対称行列の下三角ベクトルにインデックスを付ける方法を探しています。ここにいくつかの説明コードがあります:
バックグラウンド
M
ここではランダムなデータを使用しn
たn
ペアごとの行列です(表示するだけです):
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
か?
前もって感謝します。
スヴェン