如何在矩阵(R)中查找行/列组合的值?

时间:2016-07-08 16:40:42

标签: r database lookup

我在R中有以下查找问题(但我不确定我是否100%正确使用此术语)。给定是具有数据点的matrix,其中行和列名称相同并且以相同的顺序(例如,协方差矩阵)。还给出了data.frame行和列名称对,其中应在矩阵中查找相应的值。

为了说明(并使用非对称矩阵来表示一般性):

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 lml的相等行数是巧合的,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)

我很乐意指出如何正确地引用这个问题和实际解决方案。

1 个答案:

答案 0 :(得分:2)

您可以在行名称上使用矩阵子集,如下所示:

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

在帮助文件help("[")中,它说:

关于矩阵子集:

  

当通过[单个参数索引数组时] i可以是具有与x的维度一样多的列的矩阵;结果是一个向量,其元素对应于i的每一行中的索引集。

另外,关于字符子集:

  

字符向量将与对象的名称(或矩阵/数组,dimnames)匹配。

这两个功能相结合,可以实现您的目标。