目标
鉴于3个向量A
,B
和x
,我希望每次最近的Sol
得到一个向量TRUE
{1}}和A
联合来自B
和A
,如果它来自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}
}
的长度。
x
答案 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)