【问题标题】:Finding the index of the minimum value which is larger than a threshold in R在R中找到大于阈值的最小值的索引
【发布时间】:2013-08-12 14:11:00
【问题描述】:

这可能很简单,但为了简化它,我遗漏了正确的语法。

给定一个矩阵,找出一列中的最小值,大于某个输入参数。然后,在相应行的不同列中返回一个条目。不是很复杂......而且我发现了一些工作的东西,但是,一个更有效的解决方案将不胜感激。

我找到了这个链接:Better way to find a minimum value that fits a condition?

这很好..但是找到最少条目的方法丢失了在相应行中找到相应值所需的索引信息。

假设第 2 列是条件列,第 1 列是我要返回的列....目前我已经这样做了:(请注意,这仅适用于第 2 行充满的数字小于1).

matrix[which.max((matrix[,2]>threshhold)/matrix[,2]),1]

有什么想法吗?我期待可能有一些快速简便的功能具有这种效果...只是从未向我介绍过哈哈。

【问题讨论】:

  • 单线解决您的问题有什么问题?但是,如果您的截止值是负数并且有一个大于截止值的负数条目以及正数条目,则此代码将失败。
  • @JamesPringle 我认为在寻找“更简单”的解决方案时我的主要考虑因素之一是我很快就会将此代码移交给继任者。虽然这个解决方案很简洁,但它的工作原理并不是很明显。
  • 嗯,这就是代码中的 cmets 的用途。

标签: r data-manipulation


【解决方案1】:

rmk 的回答显示了从矩阵中获取大量信息的基本方法。但是,如果您知道要测试哪一列的最小值(高于您的阈值),然后想在该行中返回不同的值,可能类似于

incol<- df[,4] # select the column to search
outcol <- 2 # select the element of the found row you want to get
threshold <- 5
df[ rev(order(incol>threshold))[1] ,outcol]

【讨论】:

  • 此解决方案是否假设 incol 中至少有一个数字大于阈值?
  • @Henrik 是的,我认为确实如此,因此可能值得输入if 以确保首先获得价值。
【解决方案2】:

您可以尝试以下方法。说,

df <- matrix(sample(1:35,35),7,5)
> df
     [,1] [,2] [,3] [,4] [,5]
[1,]   18   16   27   19   31
[2,]   24    1    7   12    5
[3,]   28   35   23    4    6
[4,]   33    3   25   26   15
[5,]   14   10   11   21   20
[6,]    9    2   32   17   13
[7,]   30    8   29   22   34

假设你的阈值是 5:

apply(df,2,function(x){ x[x<5] <- max(x);which.min(x)})
[1] 6 7 2 2 2

对应的值:

[1]  9  8  7 12  5

这应该根据原始列索引为您提供大于阈值的每列中最小条目的索引。

【讨论】:

  • 抱歉,我的不等式方向有误。现在更正为“小于”
  • 我注意到,尽管如此,它可能仍然不是 100% 正确的。应该是“x[x&lt;=5]”,因为它返回 5 作为结果。
  • 这会返回每列的条目。有没有一种方法可以进一步简化它,只考虑一行中的条目?
  • @jameselmore:那么,您希望每行的列索引具有最小值(高于阈值)吗?
  • 在最好的情况下,它会在一个列中寻找最小值(高于阈值),然后在与包含高于该阈值的最小值的行相对应的不同列中返回一个值。我对该列的索引感兴趣,因为我可以将其插入我希望结果返回的列中......如果这有意义的话
猜你喜欢
  • 1970-01-01
  • 2020-04-30
  • 1970-01-01
  • 2015-04-18
  • 1970-01-01
  • 2021-11-10
  • 1970-01-01
  • 2018-10-07
  • 1970-01-01
相关资源
最近更新 更多