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

Posted

技术标签:

【中文标题】R:获取矩阵的最小元素的行和列名,但最小值!= 0【英文标题】:R: Get the row and column name of the minimum element of a matrix but with minimum != 0 【发布时间】:2014-07-23 08:36:10 【问题描述】:

我有一个包含很多零和正数值的矩阵。 我想获取元素所在的行号和列号 矩阵的最小非零值。

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

【问题讨论】:

请点击此链接获取答案,它可能对您有所帮助***.com/questions/2099720/mysql-find-min-but-not-zero 您好,我找不到任何有关 NULLIF 的有用信息。当我尝试运行此代码时,它给出了一个错误:'找不到函数 MIN'。 我是否必须按照以下方式填写:MIN(NULLIF(matrixname, 0))? @Silke 忽略带有链接的评论。这是给mysql的。我真的不知道为什么那个用户会指向你那里。无关紧要。 【参考方案1】:

使用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)

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

【讨论】:

【参考方案2】:

似乎可能有一个更短的答案,但你可以用 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)

允许重复

【讨论】:

以上是关于R:获取矩阵的最小元素的行和列名,但最小值!= 0的主要内容,如果未能解决你的问题,请参考以下文章

寻找二维数组中唯一的行和列的索引,以及这些位置上元素的最小和。

查找矩阵最小元素的 2 个或多个索引(行和列)

matlab 求出一维矩阵中最小值,且求出该最小值在矩阵中的位置,求各位帮帮忙

在 R 中,使用 rle(运行长度编码)的结果,包括命名的行和列标题

在MATLAB中,如何找出矩阵的非零元素。并且输出它所在的行和列。只要非零就为真。输出1。。

Matlab:用不包括自身的行的最小值替换矩阵中的元素