2016-07-08 85 views
0

我在R中有以下查找問題(但我不確定我是否正確使用此術語)。給定是具有數據點的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行的是偶合和nrow(l)可能更高,但對冗餘肯定發生了>25):

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("["),它說:

關於矩陣子集:

當索引陣列[一個參數我可以是一個矩陣,其中有x個維度的列;那麼結果就是一個向量,其元素對應於i的每一行中的索引集合。

另外,關於字符子集:

字符向量將被匹配的對象的名稱(或基質/陣列中,dimnames)。

這兩個功能結合起來可以實現您要找的功能。

+1

哇,我不知道它是可能的子矩陣... – tomka

+1

這幫助文件是值得的時間去通過。它有一些隱藏的jems。 – lmo