编写R函数查找BD与OD数据集符合指定条件的TF_PP差值记录
以下是符合需求的R函数实现,分别提供tidyverse(易读性优先)和data.table(大数据量性能优先)两种版本:
tidyverse 实现版本
适合中小规模数据集,语法清晰易维护:
library(dplyr) match_od_bd <- function(od_data, bd_data, diff_threshold = 2000) { # 先解除OD的原有分组,避免关联计算异常 od_clean <- od_data %>% ungroup() # 按出发日期关联两张表,过滤符合条件的记录 result <- od_clean %>% left_join(bd_data, by = "Departure_date", suffix = c("_od", "_bd")) %>% filter( # 条件1:BD创建时间晚于对应OD的创建时间 created_at_date_bd > created_at_date_od, # 条件2:TF_PP差值大于指定阈值 TF_PP_od - TF_PP_bd > diff_threshold ) %>% # 计算差值字段 mutate(Diff = TF_PP_od - TF_PP_bd) %>% # 按需求重命名并筛选返回列 select( Order_ID, Dep_Date = Departure_date, `OD(Created_at_Date)` = created_at_date_od, `OD_TF` = TF_PP_od, `BD(Created_at_Date)` = created_at_date_bd, `BD_TF` = TF_PP_bd, Diff ) return(result) } # 调用示例 output <- match_od_bd(OD, BD)
data.table 实现版本
适合百万级以上大规模数据集,执行效率更高:
library(data.table) # 先将数据集转换为data.table格式 setDT(OD) setDT(BD) match_od_bd_dt <- function(od_dt, bd_dt, diff_threshold = 2000) { result <- bd_dt[ # 按出发日期关联两张表 od_dt, on = .(Departure_date), allow.cartesian = TRUE ][ # 过滤符合条件的记录 created_at_date > i.created_at_date & i.TF_PP - TF_PP > diff_threshold ][ # 计算衍生字段并重命名 , `:=`( Diff = i.TF_PP - TF_PP, `OD(Created_at_Date)` = i.created_at_date, OD_TF = i.TF_PP, `BD(Created_at_Date)` = created_at_date, BD_TF = TF_PP, Dep_Date = Departure_date ) ][ # 筛选输出需要的列 , .(Order_ID, Dep_Date, `OD(Created_at_Date)`, OD_TF, `BD(Created_at_Date)`, BD_TF, Diff) ] return(result) } # 调用示例 output_dt <- match_od_bd_dt(OD, BD)
说明
你提供的示例测试数据中,BD和OD的TF_PP差值均未达到2000,调用函数后返回空结果属于正常情况,替换为全量业务数据即可得到符合预期的输出。
内容的提问来源于stack exchange,提问作者MSasta
相关产品推荐
相关产品推荐

