R:获取矩阵最小元素的行和列名称,但最小值为!= 0

时间:2014-06-03 05:41:35

标签: r matrix minimum

我有一个带有很多零和正数值的矩阵。 我想获得元素所在的行号和列号 矩阵的最小NONZERO值。

我没有发现min()有额外的选项来排除零,所以我怎么能 处理这个?

2 个答案:

答案 0 :(得分:1)

似乎可能有一个较短的答案,但你可以用NA替换零并使用na.rm = T

test = matrix(c(0:9,0:9),nrow =4,ncol=5)
test[which(test==0)] = NA
minValue = min(test,na.rm=T) 
rows = which(apply(test,1,min,na.rm=T)==minValue)
cols = which(apply(test,2,min,na.rm=T)==minValue)

允许重复

答案 1 :(得分:0)

使用x[x>0],您可以直接找到非零元素,但是如果您想要行号和列号,则必须付出额外的努力。我已经使用了apply方法,它会返回行号和列号索引...

set.seed(1234)

set.seed(1234)
myMat = matrix(sample(0:1,replace=T,25),nrow=5)
     [,1] [,2] [,3] [,4] [,5]
[1,]    0    1    1    1    0
[2,]    1    0    1    0    0
[3,]    1    0    0    0    0
[4,]    1    1    1    0    0
[5,]    1    1    0    0    0

#Defining a function which will return zero valued member index
FindIndex = function(x){
  v=vector()
  j=1
  for(i in 1:length(x)){
    if(x[i]>0){
      v[j]=i
      j=j+1
    }
  }
  return = v
}

#Find column number row-wise
apply(myMat, 1, FUN=FindIndex)

[[1]]
[1] 2 3 4

[[2]]
[1] 1 3

[[3]]
[1] 1

[[4]]
[1] 1 2 3

[[5]]
[1] 1 2

#Find row number column-wise
apply(myMat, 2, FUN=FindIndex)

[[1]]
[1] 2 3 4 5

[[2]]
[1] 1 4 5

[[3]]
[1] 1 2 4

[[4]]
[1] 1

[[5]]
logical(0)

您可以将此返回值转换为所需的格式..