You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 14:37:15