如何将多步R数据处理命令整合封装为单个自定义函数
R自定义匹配函数实现
你原有的函数框架存在三个问题:参数与列名重名导致筛选逻辑失效、硬编码数据对象无法适配不同输入、没有将容差规则转化为动态计算的筛选区间。以下是整合了全部分步逻辑、可直接复用的完整代码:
match_cases <- function( model_df, sim_df, target_breakover, base_section_eur, tolerance, target_wells_per_section = target_breakover ) { # 筛选匹配指定breakover值的id find_id <- model_df %>% filter(breakover == target_breakover) %>% select(id) # 关联模拟结果表 matched_case <- sim_df %>% inner_join(find_id, by = "id") # 动态计算section_eur的容差筛选区间 eur_lower <- base_section_eur * (1 - tolerance) eur_upper <- base_section_eur * (1 + tolerance) # 按条件筛选输出最终结果 final_res <- matched_case %>% filter( wells_per_section == target_wells_per_section, section_eur > eur_lower, section_eur < eur_upper ) %>% select(id, well_eur, section_eur, incr_eur) return(final_res) }
参数说明
model_df:存储breakover与id对应关系的源数据表,对应分步代码中的model对象sim_df:存储单井、区块EUR模拟结果的数据表,对应分步代码中的sim_breakover对象target_breakover:需要匹配的breakover目标值base_section_eur:section_eur的基准值tolerance:容差比例,例如15%容差输入0.15即可target_wells_per_section:需要匹配的单区块井数,默认与target_breakover取值一致,有特殊规则可单独传参
注意:不要直接使用
match作为自定义函数名,match()是R内置的基础匹配函数,重名会覆盖原生函数导致其他代码运行异常。
对应示例场景的调用方法
你给出的breakover=5、基准section_eur=65000、容差15%的测试场景,可直接运行以下代码得到结果,计算出的筛选区间与你手动计算的55250~74750完全一致:
test_result <- match_cases( model_df = model, sim_df = sim_breakover, target_breakover = 5, base_section_eur = 65000, tolerance = 0.15 )
内容的提问来源于stack exchange,提问作者Solicia
相关产品推荐
相关产品推荐

