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

如何将多步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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 16:12:22