按两个向量提供的范围进行过滤,无需连接操作

时间:2017-06-19 03:06:45

标签: r data.table dplyr subset

我希望这样做:Take dates from one dataframe and filter data in another dataframe - R

除非没有加入,因为我担心在加入我的数据后,结果将太大而无法容纳在内存中,在过滤器之前。

以下是示例数据:

tmp_df <- data.frame(a = 1:10)

我希望做一个看起来像这样的操作:

lower_bound <- c(2, 4)
upper_bound <- c(2, 5)
tmp_df %>%
    filter(a >= lower_bound & a <= upper_bound) # does not work as <= is vectorised inappropriately

我想要的结果是:

> tmp_df[(tmp_df$a <= 2 & tmp_df$a >= 2) | (tmp_df$a <= 5 & tmp_df$a >= 4), , drop = F] 
# one way to get indices to subset data frame, impractical for a long range vector
  a
2 2
4 4
5 5

我的内存要求问题(关于联接解决方案链接)是tmp_df有更多行,而lower_boundupper_bound向量有更多条目。可以选择dplyr解决方案或可以成为管道一部分的解决方案。

2 个答案:

答案 0 :(得分:7)

也许你可以从inrange借用data.table函数,

  

检查x中的每个值是否介于任何值之间   下部,上部提供的间隔。

用法:

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

答案 1 :(得分:3)

如果您想坚持使用dplyr,则它具有通过between功能提供的类似功能。

# 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

请注意,默认情况下会包含参数边界,并且无法像inrange

那样进行更改