【问题标题】:Find position of closest value to another value given a condition in R给定 R 中的条件,查找与另一个值最接近的值的位置
【发布时间】:2021-01-25 13:53:00
【问题描述】:

假设我有一个像下面的简单示例一样先增加然后减少的向量。我想确定向量中最接近某个值的位置(索引) - 但条件是后面的值必须更低(我总是想在数据的下坡处选取最接近的值)。

在下面的示例中,我希望答案是 13(而不是 6)。

我想不出使用 which.min() 或 match.closest() 的解决方案可以可靠地解决这个问题。

感谢您的帮助!

# example vector which increases then decreases
vector <- c(1,2,3,4,5,6,7,8,9,9,8,7,6,5,4,3,2,1)

# index 
index <- c(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18)

value <- 6.2

【问题讨论】:

    标签: r


    【解决方案1】:

    也许你可以像下面这样使用cummax + rev

    which.min(abs(rev(cummax(rev(vector)))-value))
    

    给了

    [1] 13
    

    【讨论】:

      【解决方案2】:

      假设您的积分在第一次减少后总是继续减少,并且value 在第一次减少的点和最后一点之间,您可以这样做:

      closest <- function(value, vec, next_is){
        lead_fun <- function(x) c(tail(x, -1), NA)
        meets_cond <- get(next_is)(lead_fun(vec), vec)
        which.min(abs(vec[meets_cond] - value)) + which.max(meets_cond) - 1
      }
      
      closest(6.2, vec = vector, next_is = '<')
      # [1] 13
      

      检查向量中哪些元素满足您的条件,找到该向量中最接近的元素的索引,然后将第一个满足您条件的元素的数量加回。

      编辑:----------------------------------------

      函数的另一个版本,它接受任意逻辑向量,对于满足条件的索引为 TRUE:

      closest <- function(value, vec, cond_vec){
        which.min(abs(vec[cond_vec] - value)) + which.max(cond_vec) - 1
      }
      

      请注意,这假设与您的条件匹配的值都在一个连续区域中(不是例如第一个匹配,然后是第三个,然后是第六个,等等)

      如果您的条件是该点在最大值之后:

      closest(6.2, vec = vector, cond_vec = seq_along(vector) > which.max(vector))
      # [1] 13
      

      【讨论】:

      • 谢谢,这个答案太棒了。所以我对代码的理解是正确的,如果需要,如果我想再次找到最接近的值,可以将其调整为稍微不同的问题,但是这次设置条件:'在向量中的最高点之后',我将如何改一下?
      • 添加了解决上述问题的编辑
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-11
      • 1970-01-01
      • 2021-10-15
      • 2018-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多