我有两个向量x
和y
。我想找到x
的哪些元素位于向量y
的两个元素之间。我怎么能在R?
x = c( .2, .4, 2.1, 5.3, 6.7, 10.5)
y = c( 1, 7)
我编写了以下代码,但它没有给我正确的结果。
> x = x[ x >= y[1] && x <= y[2]]
> x
numeric(0)
结果应该是这样的:
res = c(2.1, 5.3, 6.7)
答案 0 :(得分:5)
您正在寻找&amp;,而不是&amp;&amp;:
x = c( .2, .4, 2.1, 5.3, 6.7, 10.5)
y = c( 1, 7)
x = x[ x >= y[1] & x <= y[2]]
x
# [1] 2.1 5.3 6.7
编辑解释。以下是?'&'
的文字。
& and && indicate logical AND and | and || indicate logical OR.
The shorter form performs elementwise comparisons in much the same way as arithmetic operators.
The longer form evaluates left to right examining only the first element of each vector.
Evaluation proceeds only until the result is determined.
因此,当您使用&&
时,它会为x
的第一个元素返回FALSE并终止。
答案 1 :(得分:4)
between
和dplyr
包中包含data.table
两个便利功能
介于{dplyr}
之间这是x&gt; = left&amp;的快捷方式x&lt; = right,在C ++中为本地值高效实现,并转换为适用于远程表的SQL。
{data.table}之间的
之间等于x&gt; = lower&amp;当&lt; = upper时incbounds = TRUE,或x&gt;低和低y&lt;上限为FALSE
返回所需的值
x[between(x, min(y), max(y))]
使用findInterval的另一个选项
x[findInterval(x,y)==1L]
使用作者原始载体findInterval
似乎有轻微(微秒)的速度优势
Unit: microseconds
expr min lq mean median uq max neval
dplyr::between 14.078 14.839 20.37472 18.6435 20.5455 60.876 100
data.table::between 58.593 61.637 73.26434 68.2950 78.3780 160.560 100
findInterval 3.805 4.566 6.52944 5.7070 6.6585 35.385 100
使用大型向量更新
x <- runif(1e8, 0, 10)
y <- c(1, 7)
结果显示data.table
具有较大向量的轻微优势,但实际上它们足够接近我使用您加载的任何包
Unit: seconds
expr min lq mean median uq max neval
dplyr::between 1.879269 1.926350 1.969953 1.947727 1.995571 2.509277 100
data.table::between 1.064609 1.118584 1.166563 1.146663 1.202884 1.800333 100
findInterval 2.207620 2.273050 2.337737 2.334711 2.393277 2.763117 100
x>=min(y) & x<=max(y) 2.350481 2.429235 2.496715 2.486349 2.542527 2.921387 100
答案 2 :(得分:0)
如果y
有两个以上的元素,它就会派上用场:
x[x>=range(y)[1] & x<=range(y)[2]]