我有一个矩阵(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)
在第一个矩阵的情况下它会帮助我,但是在第二个矩阵的情况下它不会返回我期待的东西。
我更喜欢一个适用于两个矩阵的代码
答案 0 :(得分:4)
仅使用{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)
答案 1 :(得分:2)
你可以试试这个:
library(magrittr)
func = function(mat)
{
sort(mat) %>%
head(2) %>%
lapply(function(u) which(mat==u, arr.ind=T)) %>%
unique
}
#> func(df)
#[[1]]
# row col
#d 4 1
#f 6 1
#a 1 2
#b 2 2
#c 3 2
#e 5 2
#> func(df2)
#[[1]]
# row col
#[1,] 3 2
#
#[[2]]
# row col
#[1,] 5 1
因此,如果列表中有一个元素,则重复的最小值。