如何在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
相关产品推荐
相关产品推荐

