我有一个如下所示的矩阵 (df)。我想获取此矩阵中 2 个最低值的列名和行名。有多个具有最低值的单元格,我想获得具有最低值的所有单元格的索引。我可以从这些索引中随机选择 2 个索引。
在矩阵 df2 的情况下,因为只有 1 个单元格具有最低值,只有 1 个单元格具有第二低值,我应该得到这些单元格的索引(值 = 0 和值 = 1)
执行此操作的有效方法是什么?我试图对矩阵进行排序,但它没有满足我的要求:(
df<-matrix(data=c(3,7,5,0,1,0,0,0,0,8,0,9), ncol=2)
rownames(df)<-c("a","b","c","d","e","f")
df2<-matrix(data=c(3,7,5,6,1,2,4,3,0,8,2,9), ncol=2)
rownames(df)<-c("a","b","c","d","e","f")
我试过类似的方法,但效率不高
minPoint<-which(df==min(df),arr.ind=T)
在第一个矩阵的情况下它会帮助我,但在第二个矩阵的情况下它不会返回我所期望的。
我更喜欢一个适用于两个矩阵的代码
最佳答案
仅使用 {base}
并基于您的原始代码:
minPoint<-which(df <= sort(df)[2], arr.ind = T)
不仅仅是获取 min()
,使用 sort()
将返回一个排序向量,保留最小值的重复。检查小于或等于第二个元素的所有值应该满足您的要求。在 df
的情况下,前两个元素都是 0,而在 df2
中,它们是 0 和 1。
输出:
> which(df <= sort(df)[2], arr.ind = T)
row col
d 4 1
f 6 1
a 1 2
b 2 2
c 3 2
e 5 2
> which(df2 <= sort(df2)[2], arr.ind = T)
row col
[1,] 5 1
[2,] 3 2
根据@Roland 的评论进行编辑:您可以使用partial
排序优化大型矩阵,例如:
minPoint<-which(df <= sort(df, partial = 2)[2], arr.ind = T)
关于R矩阵获得两个最高值的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28414177/