R 基于多个范围的合并

R 基于多个范围的合并,r,data.table,sqldf,R,Data.table,Sqldf,我想合并多个范围上的两个数据帧。下面我举了一个有代表性的例子。sqldf解决方案可以工作,但是,我想知道是否有更好的方法来实现这一点,例如,使用data.table base <- data.frame(lower1 = c(12, 12, 3, 2), upper1 = c(20, 20, 20, 4), lower2 = c(12, 12, 3, 2), upper2 = c(20, 20, 20, 4)) %>% data.tabl

我想合并多个范围上的两个数据帧。下面我举了一个有代表性的例子。sqldf解决方案可以工作,但是,我想知道是否有更好的方法来实现这一点,例如,使用data.table

base <- data.frame(lower1 = c(12, 12, 3, 2), upper1 = c(20, 20, 20, 4), 
                   lower2 = c(12, 12, 3, 2), upper2 = c(20, 20, 20, 4)) %>% 
  data.table()

more_info <- data.frame(color = 'red', value1 = 4, value2 = 4, thing1 = 5, thing2 = 5) %>% 
  data.table()

setkey(base,      lower1, upper1, lower2, upper2)
setkey(more_info, value1, value2, thing1, thing2)

# works
sqldf('select * from base left join more_info
      on (    base.lower1 <= more_info.value1 and base.upper1 >= more_info.value1
          and base.lower2 <= more_info.thing1 and base.upper2 >= more_info.thing1)')

# doesn't work but is what i would like to do
setkey(base,      lower1, upper1, lower2, upper2)
setkey(more_info, value1, value2, thing1, thing2)

foverlaps(more_info, base, by.x = key(more_info), by.y = key(base), type = 'within', 
          mult = 'all', nomatch = NA)
作为一个小背景,我有一个匹配算法,我需要改进它的运行时间。匹配算法的工作原理是根据某些特征将大量贷款过滤为少量潜在匹配。然后,我应用任何其他必要的统计技术来找到最佳匹配。暂停是重复地将所有匹配的大数据集向下过滤到较小数量的潜在匹配。我的目标是找到一种更快的方法来创建潜在匹配的数据帧,然后使用group by和其他矢量化函数来完成匹配过程。

类似于:

more_info[base, .(lower1, upper1, lower2, upper2, color, value1 = x.value1, 
                       value2 = x.value2, thing1 = x.thing1, thing2 = x.thing2), 
          on = .(value1 >= lower1, value1 <= upper1, thing1 >= lower2, thing1 <= upper2)]
输出:

   lower1 upper1 lower2 upper2 color value1 value2 thing1 thing2
1:     12     20     12     20  <NA>     NA     NA     NA     NA
2:     12     20     12     20  <NA>     NA     NA     NA     NA
3:      3     20      3     20   red      4      4      5      5
4:      2      4      2      4  <NA>     NA     NA     NA     NA

SQL中的between关键字可用于缩短条件。setkey是data.table的一部分,而不是sqldf。“创建索引”在SQL中可用于设置索引。不确定为什么不接受此答案。。基准测试表明这个解决方案比sqldf快10倍左右……我也不认为R中有更快的解决方案,但OP可能只是SO的新手,不知道它是如何工作的。