假设您有一个向量数字向量和一个包含列和的x
数据框。有没有一种巧妙的方法可以返回一个长度等于的逻辑向量,指示 x 是否至少位于由或定义的一个区间内?df
start
stop
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
下面这样的或者,你可以
%inrange%
使用data.table
这可能太聪明了,但确实解决了你的问题。(@ThomasIsCoding 的非常相似,但稍微紧凑一些......)
更快的方法是使用
Rcpp
循环和短路编写代码(即,只要满足给定的条件就返回 TRUEx
,而不是进行所有的比较)编辑:正如用户 ThomasIsCoding 指出的那样,它是
data.table::inrange()
矢量化的: