2016-07-08 2 views
0

私はRで次のルックアップの問題があります(ただし、この用語を100%正しく使用するかどうかはわかりません)。行番号と列名が同一で、同じ順序(例えば、共分散行列のように)であるデータ点を有するmatrixが与えられている。対応する値が行列内で検索されるべき行および列の名前の対のdata.frameも与えられる。例示(および一般性のために非対称行列を使用して)する行列(R)の行/列の組み合わせの値を調べる方法は?

set.seed(1) 
m = matrix(1:25,5,5) 
colnames(m) <- c("A","B","C","D","E") 
rownames(m) <- c("A","B","C","D","E") 

l <- matrix(ncol=2,nrow=5) 
for(i in 1:5){ 
    l[i,] <- sample(c("A","B","C","D","E"),2,replace = FALSE) #choose TRUE if diagonal elements should be included in the list 
} 
l <- as.data.frame(l) 
colnames(l) <- c("row","column") 

そこで、マトリックス'm'とdata.frame lを有する(mlの行の等しい数が偶然であると冗長ペアは確かに>25のために発生してもnrow(l))は、はるかに高いことができます

A B C D E 
A 1 6 11 16 21 
B 2 7 12 17 22 
C 3 8 13 18 23 
D 4 9 14 19 24 
E 5 10 15 20 25 

    row column 
1 B  E 
2 C  D 
3 B  D 
4 E  C 
5 D  A 

そして、我々は発見したアルゴリズムを求めて:

> c(22,18,17,15,4) 

私は、この問題がどのように正確に言及されているか、実際的な解決方法を指摘してくれることを嬉しく思います。

答えて

2

次のように、行名に行列のサブセットを使用することができます。

m[cbind(as.character(l$row), as.character(l$column))] 
[1] 22 18 17 15 4 

ヘルプファイルhelp("[")から、それは言う:行列のサブセットに関する

によって配列のインデックスを作成するとき[1つの引数iは、xの次元と同じ数の列を持つ行列にすることができます。結果は、iの各行にあるインデックスのセットに対応する要素を持つベクトルになります。文字のサブセットについても

文字ベクトルは、オブジェクトの名前に一致する(またはマトリックス/アレイ、dimnames用)。

これらの2つの機能を組み合わせて、あなたが探しているものを実現します。

+1

うわー、私はそれがマトリックスでサブセット化することが可能であることを知らなかった... – tomka

+1

そのヘルプファイルは確かに通過する時間の価値があります。それはいくつかの隠された宝石を持っています。 – lmo

関連する問題