如果向量的元素至少在一个区间内,是否有一种快速/聪明的方法来返回逻辑向量?

问题描述 投票:0回答:2

假设您有向量数值向量

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
r subset data-cleaning
2个回答
1
投票

也许你可以像下面这样使用

outer

> with(df, which(rowMeans(outer(x, start, `>=`) & outer(x, stop, `<=`)) > 0))
[1] 1 5 6 7 8

0
投票

这可能是聪明,但确实解决了你的问题。 (@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]
© www.soinside.com 2019 - 2024. All rights reserved.