我有两个整数向量,对于第二个向量的每个元素,我想找到第一个向量的任何元素的最小距离 - 例如
obj1 <- seq(0, 1000, length.out=11)
obj2 <- 30:50
min_diff <- sapply(obj2, function(x) min(abs(obj1-x)))
min_diff
Run Code Online (Sandbox Code Playgroud)
回报
[1] 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
Run Code Online (Sandbox Code Playgroud)
有更有效的方法吗?我想把它扩展到数千(百万?)的obj1和obj2.
谢谢你,亚伦
Jon*_*ang 14
我会使用在第一个向量上排序的步骤函数.这将避免循环并且在R中相当快.
x <- rnorm(1000)
y <- rnorm(1000)
sorted.x <- sort(x)
myfun <- stepfun(sorted.x, 0:length(x))
Run Code Online (Sandbox Code Playgroud)
现在myfun(1)将为您提供sorted.x其值小于的最大元素的索引1.就我而言,
> myfun(1)
[1] 842
> sorted.x[842]
[1] 0.997574
> sorted.x[843]
[1] 1.014771
Run Code Online (Sandbox Code Playgroud)
所以你知道最接近的元素是sorted.x[myfun(1)]或者sorted.x[myfun(1) + 1].因此(和填充为0),
indices <- pmin(pmax(1, myfun(y)), length(sorted.x) - 1)
mindist <- pmin(abs(y - sorted.x[indices]), abs(y - sorted.x[indices + 1]))
Run Code Online (Sandbox Code Playgroud)