查找与R中的值最接近的索引

时间:2017-03-04 10:43:01

标签: r search vector indexing

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

让我们说我的矢量如下:

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

并且,我们说我有价值&#39; 5&#39;。我想在&#34; vector&#34;中找到最大索引。它小于或等于值5.在上述例子的情况下,该指数为3(因为4小于或等于5)。同样,如果我有一个矢量,如:

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

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

但是,我还希望找到此索引发生的 first last 时间。例如,如果我有一个矢量,如:

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

然后第一次出现这个索引是6,这个索引最后一次出现的时间是9。

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

提前致谢。

4 个答案:

答案 0 :(得分:3)

您可以使用以下代码:

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

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

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

第三,它采用了这两个指数中的第一个

答案 1 :(得分:3)

感谢所有回复的人,我实际上通过下载包BBmisc找到了一个非常简短的单行方法。它有一个名为which.lastwhich.first的函数,它们执行我需要的操作。再次感谢您花时间回复,我很感激。

答案 2 :(得分:2)

您可以使用:

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)

答案 3 :(得分:1)

我认为这里不需要包装。看起来构造which(x == max(x[x <= 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