我希望这个能帮上忙,
dplyr::filter(merge(df1, df2, by='Chr'), Location >= Start, Location <= End)
使用数据表:
dt <- data.table(merge(df1, df2, by='Chr')) dt[Location >= Start & Location <= End]
在当前devel版本的data.table中, non-equi 联接已实施。您可以按照说明进行安装 这里 。有了这个,这可以非常有效地完成如下:
non-equi
setDT(DF2)[DF1, .(Chr, Start, End, Region, Site, Gene), on = .(Chr, Location>=Start, Location<=End)] # Chr Start End Region Site Gene # 1: chr6 3324 3360 Region1 Site3 GeneM # 2: chr6 3324 3360 Region1 Site6 GeneF # 3: chr4 2445 2455 Region2 Site1 GeneB # 4: chr4 2445 2455 Region2 Site8 GeneO # 5: chr1 1034 1090 Region4 Site4 GeneC
加入 Chr 单独创建不必要的组合只是为了在下一步中过滤它们。但 非等距 连接直接查找匹配的条目(因此在速度和内存方面的效率)。
Chr