gpt4 book ai didi

r - 以容差匹配两个非常非常大的向量(快速!但节省工作空间)

转载 作者:行者123 更新时间:2023-12-02 12:32:31 25 4
gpt4 key购买 nike

考虑我有两个向量。一种是引用向量/列表,其中包括所有感兴趣的值和一个可能包含任何可能值的样本向量。现在我想在引用列表中找到我的样本的匹配项,该匹配项具有一定的容差,该容差不是固定的并且取决于向量内的比较值:

matches: abs(((referencelist - sample[i])/sample[i])*10^6)) < 0.5

舍入两个向量是不可能的!

例如考虑:

referencelist <- read.table(header=TRUE, text="value  name
154.00312 A
154.07685 B
154.21452 C
154.49545 D
156.77310 E
156.83991 F
159.02992 G
159.65553 H
159.93843 I")

sample <- c(154.00315, 159.02991, 154.07688, 156.77312)

所以我得到结果:

    name value      reference
1 A 154.00315 154.00312
2 G 159.02991 159.02992
3 B 154.07688 154.07685
4 E 156.77312 156.77310

我能做的就是使用例如外部函数如

myDist <- outer(referencelist, sample, FUN=function(x, y) abs(((x - y)/y)*10^6))
matches <- which(myDist < 0.5, arr.ind=TRUE)
data.frame(name = referencelist$name[matches[, 1]], value=sample[matches[, 2]])

或者我可以使用 for() 循环。

但我的特殊问题是,引用向量大约有 1*10^12 个条目,而我的样本向量大约有 1*10^7 个条目。因此,通过使用outer(),我可以轻松破坏所有工作空间限制,并且通过使用for()或链式for()循环,这将需要几天/几周才能完成。

有谁知道如何在 R 中快速完成此操作,仍然精确,但在计算机上工作消耗最大。 64 GB 内存?

感谢您的帮助!

最美好的愿望

最佳答案

使用data.table(并从@eddi的binary search复制粘贴(也称为二分法,参见@John Coleman的评论)):

library(data.table)

dt <- as.data.table(referencelist)
setattr(dt, "sorted", "value")

tol <- 0.5
dt2 <- dt[J(sample), .(.I, ref = value, name), roll = "nearest", by = .EACHI]
dt2[, diff := abs(ref - value) / value * 1e6]
dt2[diff <= tol]

# value I ref name diff
# 1: 154.0032 1 154.0031 A 0.19480121
# 2: 159.0299 7 159.0299 G 0.06288125
# 3: 154.0769 2 154.0769 B 0.19470799
# 4: 156.7731 5 156.7731 E 0.12757289

我还没有对内存使用情况和执行时间进行基准测试,但是 data.table 在这两方面都非常擅长。如果它对您不起作用,请说出来,也许我会尝试对事物进行基准测试。

注意:我对 data.table 的使用非常幼稚。

下面有一个使用 findInterval 的解决方案:https://stackoverflow.com/a/29552922/6197649 ,但我预计它的性能会更差(再次:需要基准测试)。

关于r - 以容差匹配两个非常非常大的向量(快速!但节省工作空间),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46957566/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com