【问题标题】:Finding the closest index to a value in R查找与 R 中的值最接近的索引
【发布时间】:2017-03-04 10:43:00
【问题描述】:

我有一个关于在向量中查找索引值的问题。

假设我有一个向量如下:

vector <- c(1,2,4,6,8,10)

而且,假设我的值为“5”。我想在“向量”中找到最大索引,使其小于或等于值 5。在上面的示例中,该索引为 3(因为 4 小于或等于 5)。同样,如果我有一个向量,例如:

vector <- c(1,2,4,5,6,8,10)

如果我要找到一个小于或等于 5 的值,那么这个索引现在将是 4 而不是 3。

不过,我也想找出这个索引出现的firstlast 时间。例如,如果我有一个向量,例如:

vector <- c(1,1,2,2,4,5,5,5,5,6,8,10)

那么这个索引第一次出现是6,这个索引最后一次出现是9。

是否有一种简短的单行方法可以让我执行此任务?到目前为止,我一直在使用函数 max(which(....)),但是我发现这种方法对于大型数据集来说效率极低,因为它实际上会列出数百/数千个值,所以我想找到一个如果可能的话,更有效的方法可以放在一行中。

提前致谢。

【问题讨论】:

  • 如果vector 已排序,请参阅?findInterval——使用“left.open = TRUE”调用一次,使用“left.open = FALSE”调用一次应该给出两个索引(加上一个if 的一些操作将 &lt;&lt;= 区别开来

标签: r search vector indexing


【解决方案1】:

您可以使用以下代码:

min(max(which(vector <= 5)), min(which(vector == 5)))

首先,它使用which函数搜索所有vector小于或等于5的索引,然后取最大值。

其次,它搜索vector等于5的所有索引并取最小值。

第三,它取这两个索引中的第一个

【讨论】:

  • 是否有另一种方法可以使“min”(或“max”)位于“which”函数内?我现在实际上有一个非常相似的代码 - 我遇到的问题是我有一个非常大的数据集,所以会发生什么是“which”函数返回数千个值,然后是“max”函数然后取其中的最大值。由于我迭代了数百次,这导致我的程序运行非常缓慢,所以我正在寻找一种更有效的方法来完成这项任务
  • 对于min 部分,您可以简单地使用which(vector == 5)[1],但我不确定它会减少运行时间
【解决方案2】:

感谢所有回复的人,我实际上找到了一种非常简短的单行方法,方法是下载一个包BBmisc。它具有称为which.lastwhich.first 的函数,它们执行我需要的操作。再次感谢您抽出宝贵时间回复,非常感谢。

【讨论】:

【解决方案3】:

你可以使用:

my_ind <- function(vec, num){
  ind <- which.max(vec == num) # Check for equality first
  if(ind == 1L && vec[1L] != num){
    ind <- which.min(vec < num) - 1L
  }
  ind
}

my_ind(c(1,2,4,6,8,10), 5L) # 3
my_ind(c(1,2,4,5,6,8,10), 5L) # 4
my_ind(c(1,1,2,2,4,5,5,5,5,6,8,10), 5L) # 6
my_ind(c(5,8,10), 5L) # 1
my_ind(c(6,8,10), 5L) # 0 - returns 0 if all(vec > 5L)

【讨论】:

    【解决方案4】:

    我认为这里不需要软件包。看起来which(x == max(x[x &lt;= 5])) 的构造对你有用。

    x <- c(1, 2, 4, 6, 8, 10)
    which(x == max(x[x <= 5]))
    # [1] 3
    
    x <- c(1, 2, 4, 5, 6, 8, 10)
    which(x == max(x[x <= 5]))
    # [1] 4
    
    x <- c(1, 1, 2, 2, 4, 5, 5, 5, 5, 6, 8, 10)
    which(x == max(x[x <= 5]))
    # [1] 6 7 8 9
    

    要查找多个索引的最小/最大索引,请使用head/tail

    head(which(x == max(x[x <= 5])), 1)
    # [1] 6
    tail(which(x == max(x[x <= 5])), 1)
    # [1] 9
    

    【讨论】:

    • 假设我已经理解了这个问题
    猜你喜欢
    • 2016-07-19
    • 1970-01-01
    • 2021-10-15
    • 2013-03-29
    • 1970-01-01
    • 2017-03-15
    • 1970-01-01
    • 1970-01-01
    • 2020-05-07
    相关资源
    最近更新 更多