哪个向量具有最接近的较低值?

时间:2016-01-15 23:07:12

标签: r performance vector

目标

鉴于3个向量ABx,我希望每次最近的Sol得到一个向量TRUE {1}}和A联合来自BA,如果它来自FALSE

有关数据的信息

  • B是一个相对较短(~80个元素)的整数向量。
  • A是一个相对较短(约200个元素)的整数向量。
  • B是一个非常长的(可能是1e7-1e8)整数向量。

示例数据

这些数据比我要短得多

x

非执行解决方案

以下情况应该有效,但随着set.seed(31) while(TRUE) { A = floor(runif(30, 1,1e5)) B = c(1,floor(runif(80, 1,1e5))) if (!any(c(A %in% B, B %in% A))){break} } x = floor(runif(300, 1,1e5)) 变得很长,它会很慢。

x

关于效果的说明

这个过程可能会重复1000次。我目前没有准确估计重复次数和Sol = rep(NA,length(x)) for (i in 1:length(x)) { xi = x[i] mA = max(A[A<=xi]) mB = max(B[B<=xi]) if (mA>mB) {Sol[i]=TRUE} else {Sol[i]=FALSE} } 的长度。

基准@MaratTalipov与我的比较

x

2 个答案:

答案 0 :(得分:4)

这种方法怎么样:

d <- rbind(data.frame(x=TRUE,y=A),data.frame(x=FALSE,y=B))
d <- d[order(d$y),]
out <- d$x[findInterval(x,d$y)]

答案 1 :(得分:0)

尝试使用此方法(应用函数族)。它仍然必须循环遍历x的所有值,因此没有避免线性扫描,但比直接循环更有效。我添加了一个附加条件,其中x的值低于A或B的所有值,并且在这种情况下返回NA。如果你想要NULL,你可以删除它。

sapply(x, function(x) if (x < min(A) || x < min(B)) NA else if (max(A[A <= x]) > max(B[B <= x])) TRUE else FALSE)