Filter by ranges supplied by two vectors, without a join operation

家住魔仙堡 提交于 2019-12-01 04:20:47

Maybe you could borrow the inrange function from data.table, which

checks whether each value in x is in between any of the intervals provided in lower,upper.

Usage:

inrange(x, lower, upper, incbounds=TRUE)

library(dplyr); library(data.table)

tmp_df %>% filter(inrange(a, c(2,4), c(2,5)))
#  a
#1 2
#2 4
#3 5

If you'd like to stick with dplyr it has similar functionality provided through the between function.

# ranges I want to check between
my_ranges <- list(c(2,2), c(4,5), c(6,7))

tmp_df <- data.frame(a=1:10)
tmp_df %>% 
  filter(apply(bind_rows(lapply(my_ranges, 
                                FUN=function(x, a){
                                  data.frame(t(between(a, x[1], x[2])))
                                  }, a)
                         ), 2, any))
  a
1 2
2 4
3 5
4 6
5 7

Just be aware that the argument boundaries are included by default and that cannot be changed as with inrange

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!