如何在R中基于两列区间值为df2新增Location列
在R中实现区间匹配并添加对应列
示例数据构造
先还原问题中的两个数据框:
df1 <- data.frame( location = c("a_a1", "b_a1", "c_a1"), start_position = c(2500, 5600, 7500), end_position = c(5500, 6500, 8900), stringsAsFactors = FALSE ) df2 <- data.frame( Sample = c("A1", "A2", "A3"), Position = c(2300, 5300, 7600), stringsAsFactors = FALSE )
方法1:Base R 原生实现
通过sapply遍历df2的Position值,逐一匹配df1中的区间范围,提取对应的location:
df2$Location <- sapply(df2$Position, function(pos) { df1$location[pos >= df1$start_position & pos <= df1$end_position] })
方法2:dplyr + fuzzyjoin 实现
适合习惯tidyverse语法的用户,fuzzyjoin支持非等值连接,代码逻辑更直观:
library(dplyr) library(fuzzyjoin) df2 <- df2 %>% fuzzy_left_join( df1, by = c("Position" = "start_position", "Position" = "end_position"), match_fun = list(`>=`, `<=`) ) %>% select(Sample, Position, Location = location)
方法3:data.table 非等连接实现
如果处理大数据量,data.table的非等连接效率最优:
library(data.table) # 转换为data.table格式 setDT(df1) setDT(df2) # 非等连接并赋值Location列 df2[df1, on = .(Position >= start_position, Position <= end_position), Location := i.location]
注意事项
- 若某个
Position匹配多个区间,Base R方法会返回匹配的所有location向量,其他方法会生成多行记录,需根据需求做去重或筛选; - 无匹配区间的
Position会对应NA,可通过replace或ifelse设置默认值。
内容的提问来源于stack exchange,提问作者Aryh
相关产品推荐
相关产品推荐

