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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 21:09:01