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

标签 r

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

A = runif(n = 1e6)
B = seq(0,1,by = 1e-3)

现在给定一个“向前”或“向后”的方向,对于 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)<min(A)max(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

关于R快速方法为A中的每个元素找到向量B中最接近的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39367372/

相关文章:

r - 提取数据框中每个元素的前n个值的索引

r - 将 RCurl 与 SFTP 一起使用

r - strtoi 无法将字符串转换为整数,返回 NA

r - 按R中的所有列对数据框进行排序

r - 世界上有多少个 CRANextra 镜子?

r - R 中的字符串分割

regex - 使用 stringr 从 R 中的文本字符串中提取一个或多个单词

r - 将标签添加到 R 中的剪切功能

R 图形 : axis label placement relative to tick labels?

r - 如何在ggplot的geom_text标签中键入下标