R为A中的每个元素找到向量B中最近值的快速方法

R为A中的每个元素找到向量B中最近值的快速方法,r,R,我有一个非常大的未排序向量a和一个排序向量B(相对较短) 现在给定一个方向“向前”或“向后”,对于a中的每个元素,找到B中具有该方向的最近元素。例如“前进” A2 = sapply(A, function(x) B[B>=x][1]) 给出了结果。但是,这太慢了,因为sapply在A上循环 > system.time(sapply(A, function(x) B[B>=x][1])) user system elapsed 17.93 0.00 17

我有一个非常大的未排序向量a和一个排序向量B(相对较短)

现在给定一个方向“向前”或“向后”,对于a中的每个元素,找到B中具有该方向的最近元素。例如“前进”

A2 = sapply(A, function(x) B[B>=x][1])
给出了结果。但是,这太慢了,因为
sapply
在A上循环

> system.time(sapply(A, function(x) B[B>=x][1]))
   user  system elapsed 
  17.93    0.00   17.93 
有没有一种方法可以更快地做到这一点


(保证
min(B)max(A)
,如果有用)

函数
findInterval
使用二进制搜索解决了这个确切的问题。试试这个:

B[findInterval(A,B)+1]
比较:

set.seed(44)
A <- runif(n = 1e6)
B <- seq(0,1,by = 1e-3)
system.time(A2<-sapply(A, function(x) B[B>=x][1]))
#   user  system elapsed 
# 18.058   0.000  15.606
system.time(A3<-B[findInterval(A,B)+1])  
#   user  system elapsed 
#   0.00    0.00    0.07
identical(A2,A3)
#[1] TRUE
set.seed(44)
A.
set.seed(44)
A <- runif(n = 1e6)
B <- seq(0,1,by = 1e-3)
system.time(A2<-sapply(A, function(x) B[B>=x][1]))
#   user  system elapsed 
# 18.058   0.000  15.606
system.time(A3<-B[findInterval(A,B)+1])  
#   user  system elapsed 
#   0.00    0.00    0.07
identical(A2,A3)
#[1] TRUE