基于区间桶的DataFrame值匹配:将Key映射到对应区间Value
解决R语言中区间匹配的问题
这是个非常典型的区间匹配场景,我给你分享几种实用的实现方法,都能完美适配你的示例数据:
首先先确认你的示例数据(方便大家复现):
# 原始数据 df1 <- data.frame(MIN = c(1,4,8, 14), MAX = c(3, 6, 10, 18), VALUE = c(3, 56, 3, 5)) df2 <- data.frame(KEY = c(2,5,9,18,3)) # 期望结果 df3 <- data.frame(KEY = c(2,5,9,18,3), VALUE = c(3, 56, 3, 5, 3))
方法一:Base R 基础实现(小数据量友好)
用sapply遍历每个KEY值,匹配符合MIN <= KEY <= MAX条件的VALUE,逻辑直观易懂,适合数据量不大的场景:
df3_base <- df2 df3_base$VALUE <- sapply(df3_base$KEY, function(k) { df1$VALUE[df1$MIN <= k & df1$MAX >= k] }) # 查看结果 df3_base
方法二:dplyr 非等值连接(大数据量高效)
如果你常用tidyverse生态,推荐用非等值连接(non-equi join),这比逐行遍历效率高很多,尤其适合处理大数据:
library(dplyr) # 需要dplyr 1.1.0及以上版本支持join_by语法 df3_dplyr <- df2 %>% left_join(df1, join_by(KEY >= MIN, KEY <= MAX)) %>% select(KEY, VALUE) # 查看结果 df3_dplyr
方法三:data.table 非等值连接(极致高效)
如果你的数据量特别大,data.table的非等值连接是性能天花板级别的选择,处理速度远超其他方法:
library(data.table) # 转换为data.table格式 setDT(df1) setDT(df2) # 非等值连接匹配 df3_dt <- df2[df1, on = .(KEY >= MIN, KEY <= MAX), .(KEY, VALUE = i.VALUE)] # 查看结果 df3_dt
以上三种方法都能准确得到你想要的df3结果,你可以根据自己的数据量和常用工具链选择合适的方案~
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

