R语言如何比较两个数据框匹配天数区间为DF1新增Days_Slot列
R语言实现区间匹配生成Days_Slot列的方法
以下是3种不同场景下的实现方案:
方法1:基础R的cut函数(最简便,无需额外安装包)
适合固定连续分箱的场景,代码量最少:
# 构造示例数据 Items=c("Vegetables","Fruits","Grocery","Dairy Product") Days=c(16,5,41,25) DF1=data.frame(Items,Days) Low_Range=c(0,8,15,22,31,61) Hi_Range=c(7,14,21,30,60,90) Days_Range=c("within 7 days","8 to 14 days","15 to 21 days","22 to 30 days","31 to 60 days","61 to 90 days") DF2=data.frame(Low_Range,Hi_Range,Days_Range) # 用cut函数实现分箱匹配 DF1$Days_Slot <- cut(DF1$Days, breaks = c(DF2$Low_Range, max(DF2$Hi_Range)), labels = DF2$Days_Range, right = TRUE, # 区间右闭,匹配<=上限的规则 include.lowest = TRUE) # 包含最小值,匹配>=下限的规则 # 可选:将默认生成的因子类型转为字符型 DF1$Days_Slot <- as.character(DF1$Days_Slot) # 输出结果 print(DF1)
方法2:dplyr + fuzzyjoin非等值连接(灵活度最高)
适合区间规则复杂、后续可能调整匹配逻辑的场景,贴合tidyverse生态使用习惯:
# 加载依赖包 library(dplyr) library(fuzzyjoin) DF_Result <- DF1 %>% fuzzy_left_join(DF2, by = c("Days" = "Low_Range", "Days" = "Hi_Range"), match_fun = list(`>=`, `<=`)) %>% # 核心匹配规则:Days>=区间下限且<=区间上限 select(Items, Days, Days_Slot = Days_Range) # 整理输出列 # 输出结果 print(DF_Result)
方法3:data.table非等值连接(性能最优)
适合10万行以上的大数据量场景,运行速度远高于前两种方案:
# 加载依赖包 library(data.table) # 转换为data.table格式 setDT(DF1) setDT(DF2) # 非等值连接匹配 DF_Result <- DF2[DF1, on = .(Low_Range <= Days, Hi_Range >= Days)] %>% .[,.(Items, Days = Low_Range, Days_Slot = Days_Range)] # 整理列名和输出内容 # 输出结果 print(DF_Result)
内容的提问来源于stack exchange,提问作者ParthaSarathi
相关产品推荐
相关产品推荐

