假设您有向量数值向量
x
和数据框 df
,其中包含列 start
和 stop
。有没有一种聪明的方法来返回长度等于 x
的逻辑向量,指示 x 是否至少在由 start
或 stop
定义的一个区间内?
我正在处理的实际案例有
length(x)
>>nrow(df)
。最简单的方法是使用 for 循环,但我希望有更优雅且运行速度更快的东西。
x <- 1:10
df <- data.frame(start = c(0, 4.5, 6), stop = c(1, 5.5, 8.5))
z <- rep(FALSE, length(x))
for(i in 1:nrow(df)){
z <- z | (df$start[i] <= x & x <= df$stop[i])
}
x[z] # 1 5 6 7 8
也许你可以像下面这样使用
outer
> with(df, which(rowMeans(outer(x, start, `>=`) & outer(x, stop, `<=`)) > 0))
[1] 1 5 6 7 8
这可能是太聪明,但确实解决了你的问题。 (@ThomasIsCoding 的稍微好一些......)
x_gt_start <- outer(x,df$start, ">=")
x_lt_stop <- outer(x,df$stop, "<=")
between <- rowSums(x_gt_start & x_lt_stop) >= 1 ## or: apply(..., 1, any)
x[between]