找到向量的哪个元素在R中的两个值之间

时间:2013-12-23 23:55:11

标签: r vector

我有两个向量xy。我想找到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)

3 个答案:

答案 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)

betweendplyr包中包含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]]