我在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 l
(m
和l
的相等行数是巧合的,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)
我很乐意指出如何正确地引用这个问题和实际解决方案。
答案 0 :(得分:2)
您可以在行名称上使用矩阵子集,如下所示:
m[cbind(as.character(l$row), as.character(l$column))]
[1] 22 18 17 15 4
在帮助文件help("[")
中,它说:
关于矩阵子集:
当通过[单个参数索引数组时] i可以是具有与x的维度一样多的列的矩阵;结果是一个向量,其元素对应于i的每一行中的索引集。
另外,关于字符子集:
字符向量将与对象的名称(或矩阵/数组,dimnames)匹配。
这两个功能相结合,可以实现您的目标。