【问题标题】:How to single out specific values in a matrix [R]如何挑选出矩阵中的特定值 [R]
【发布时间】:2022-01-05 05:29:13
【问题描述】:

您好,我有一个难题。我这里有一个以下矩阵:

         [,1]     [,2]     [,3]     [,4]     [,5]
  [1,] 0.000000 1.414214 2.828427 4.242641 5.656854
  [2,] 1.414214 0.000000 1.414214 2.828427 4.242641
  [3,] 2.828427 1.414214 0.000000 1.414214 2.828427
  [4,] 4.242641 2.828427 1.414214 0.000000 1.414214
  [5,] 5.656854 4.242641 2.828427 1.414214 0.000000

我的问题是如何在上面的矩阵中挑选出最小的非零值。显然,如果我使用 min(A) 我会得到 0 作为答案,但我想要的是值 1.414214

【问题讨论】:

    标签: r math matrix min


    【解决方案1】:

    a 的最小值,其中 a 不等于 0

    min(a[a!=0])
    

    带有打印索引的功能:

    min_value <- function(M){
      
      minval <- min(M[M!=0])
      index <- which(M==minval, arr.ind=TRUE)
      
      print(paste("The smallest non-zero value (", minval, ") is located in:", sep=""))
      
      for(i in 1:nrow(index)){
        print(paste("row[", index[i, 1] ,"] and column[", index[i, 2], "]", sep="" ))
      }
      
      return(list(min_value=minval, index=index))
    }
    

    【讨论】:

      【解决方案2】:

      我们可以将tail()which 一起使用:这里mat 是您的矩阵

      1. 从第一个非零值中获取索引yourIndex
      2. 然后调用矩阵中的值
      yourIndex <- tail(which(mat!=0),1)
      mat[yourIndex]
      
      OR shorter:
      
      mat[tail(which(mat!=0,1)
      
      > mat[yourIndex]
      [1] 1.414214
      

      【讨论】:

      • 有没有办法可以把它放在一个函数中,一旦我找到了值,它就会打印以下单词。 print(The smallest non-zero value is located in column[j] and row[i]。它应该适用于所有矩阵,而不仅仅是上面提到的那个。这有点像在 python 中你可以一次打印两个东西(一个语句和一个值),但这次我希望它能够自动为任何矩阵工作
      【解决方案3】:

      使用矩阵你可以做一个简单的for循环

      min_numbers <- rep(NA,5)
      
      for (i in 1:5){
        min_numbers[i] <- min(m[(m[,i] > 0),i])
      }
      
      min_numbers
      

      但我宁愿使用tydiverse 上的数据框

      【讨论】:

        猜你喜欢
        • 2018-10-20
        • 2021-02-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-13
        • 2020-10-13
        相关资源
        最近更新 更多