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

如何在R中基于多列连接数据框,允许某列值相差1-2

允许yardline_100差值±1或±2的多列连接解决方案

针对你需要在posteam、qtr、down精确匹配的基础上,允许yardline_100列差值≤2的连接需求,以下两种方法可以实现:

方法1:使用fuzzyjoin包实现模糊连接

fuzzyjoin专门处理非精确匹配场景,语法贴合dplyr风格,适合快速实现需求:

# 首次使用需安装包
install.packages("fuzzyjoin")

library(fuzzyjoin)
library(dplyr)

fin_df <- df1 %>%
  fuzzy_left_join(
    df2,
    by = c("posteam", "qtr", "down", "yardline_100"),
    # 指定各列的匹配规则
    match_fun = list(
      `==`,  # posteam精确匹配
      `==`,  # qtr精确匹配
      `==`,  # down精确匹配
      function(x, y) abs(x - y) <= 2  # yardline_100差值不超过2
    )
  )

方法2:使用data.table的非等连接(大数据量推荐)

如果你的数据规模较大,data.table的非等连接效率更高,内存占用更低:

library(data.table)

# 转换为data.table格式
setDT(df1)
setDT(df2)

# 执行非等左连接,限定yardline_100的范围
fin_df <- df1[df2, 
              on = .(posteam, qtr, down, 
                     yardline_100 >= yardline_100 - 2, 
                     yardline_100 <= yardline_100 + 2),
              nomatch = NA,  # 无匹配时保留NA
              allow.cartesian = TRUE] %>%
  # 清理连接后生成的冗余列
  select(-c(yardline_100.1, yardline_100.2))

结果说明

针对你的示例数据,两种方法都会成功匹配以下情况:

  • df1中yardline_100=52(down=3)与df2中yardline_100=53(差值1)
  • df1中yardline_100=15(down=2/3)与df2中yardline_100=16(差值1)

如果存在多个符合条件的匹配项,结果会生成多行,可根据实际需求进一步去重或筛选。

内容的提问来源于stack exchange,提问作者Sam Hoppen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 17:44:13