2017-03-04 83 views
0

我有一个关于在向量中查找索引值的问题。查找与R中的值最接近的索引

比方说,我有一个向量如下:

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.

然而,我还想先找到最后这个指标发生的时间。例如,如果我有一个载体如:

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

然后第一次发生这种索引将是6和此指数发生最后一次将9.

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

在此先感谢。

+0

如果对'vector'进行排序,请参阅'?findInterval' - 用“left.open = TRUE”调用一次,用“left”调用一次。open = FALSE“应该给出两个索引(加上一些”if“操作来区别'<'从'<=' –

回答

3

您可以使用下面的代码:

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

首先,它会搜索所有指数,其中vector小于或等于5 which功能,那么它需要中最大的一个。

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

第三,它需要第一这两个指数的

+0

是否有另一种方法来做到这一点,使得”min“(或”max“)是在“which”函数里面?我其实有一个非常类似的代码 - 我遇到的问题是我有一个非常大的数据集,所以会发生什么是“哪个”函数返回数以千计的值然后“max”函数取最大值,因为我迭代了数百次,这导致我的程序运行速度很慢,所以我正在寻找一种更有效的方法来完成这项任务 – ThePlowKing

+0

对于'min'部分,你可以简单地使用'which(vector == 5)[1]',但我不确定它会减少运行时间 – Pop

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) 
2

感谢所有那些谁回答,我居然发现了一个极短的,单行法做到这一点通过下载一个包BBmisc。它具有称为which.lastwhich.first的功能,并且它们执行我需要的操作。再次感谢您花时间回复,我很感激。

+0

请参阅这里了解该函数的__c__源代码 - https://github.com/berndbischl /BBmisc/blob/95a625fe0bd92413910f8c4f8f9c79c801a96af9/src/which_first.c#L14 – Rentrop

0

我没有看到这里需要包。它看起来像构造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

​​
+0

假设I'v e理解了这个问题 –