R 求一个向量和另一个向量的每个元素之间的最小差
我有两个整数向量,对于第二个向量的每个元素,我想找到到第一个向量的任何元素的最小距离,例如R 求一个向量和另一个向量的每个元素之间的最小差,r,R,我有两个整数向量,对于第二个向量的每个元素,我想找到到第一个向量的任何元素的最小距离,例如 obj1 <- seq(0, 1000, length.out=11) obj2 <- 30:50 min_diff <- sapply(obj2, function(x) min(abs(obj1-x))) min_diff 有没有更有效的方法?我想将obj1和obj2的规模扩大到数千(百万?) 谢谢, Aaron从排序obj1开始 然后可以在obj1中对obj2的每个元素进行二进制
obj1 <- seq(0, 1000, length.out=11)
obj2 <- 30:50
min_diff <- sapply(obj2, function(x) min(abs(obj1-x)))
min_diff
有没有更有效的方法?我想将obj1和obj2的规模扩大到数千(百万?)
谢谢,
Aaron从排序obj1开始
然后可以在obj1中对obj2的每个元素进行二进制搜索。知道元素的位置后,可以将距离与obj1的两个相邻元素进行比较,从而获得最小距离
运行时(其中n1=| obj1 |和n2=| obj2 |):
(n1+n2)log(n1)我将使用按第一个向量排序的步长函数。这将避免循环,并且在R中非常快
x <- rnorm(1000)
y <- rnorm(1000)
sorted.x <- sort(x)
myfun <- stepfun(sorted.x, 0:length(x))
因此,您知道最近的元素是sorted.x[myfun(1)]
或sorted.x[myfun(1)+1]
。因此(填充为0)
索引回复张杰:
感谢您提供强大而快速的解决方案
对于我使用您的4行代码,我需要找到最小差异(以检查是否可以接受):
这是一个“愚蠢”的错误,几年后我才注意到。我想选取差异较小的值。。。我打赌你会看到的
min_diff.idx = which.min(mindist)
sorted.x[indices[min_diff.idx]]
由于mindist check sorted.x[索引]和sorted.x[索引+1]同时进行,它们可能会对idx造成混淆,因为这两个比较具有相同的索引
例子:
如果指数为55,56
正念者将检查55,56(指数)和56,57(指数+1)
如果正念者发现最小值为56,但在指数+1(56)内,则为57
有没有办法保存正确的索引?
我们需要更多信息。哪个是变化的obj1、obj2或两者?有多少个独特的元素?obj1和obj2现在需要扩展到数万个,将来需要扩展到数百万个,而且两者都不包含重复的元素
> myfun(1)
[1] 842
> sorted.x[842]
[1] 0.997574
> sorted.x[843]
[1] 1.014771
indices <- pmin(pmax(1, myfun(y)), length(sorted.x) - 1)
mindist <- pmin(abs(y - sorted.x[indices]), abs(y - sorted.x[indices + 1]))
min_diff.val = min(mindist)
min_diff.idx = which.min(mindist)
sorted.x[indices[min_diff.idx]]