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

R语言如何让自定义子集均值函数随机忽略部分过滤条件?

实现方法

第一步:修改my_subset_mean函数适配忽略逻辑

首先调整过滤逻辑,当参数为NA时自动跳过对应筛选条件,无需修改原始因子的levels:

my_subset_mean <- function(r1, r2, r3, r4){  
  subset <- df %>% 
    filter(
      is.na(r1) | a %in% r1, # r1为NA则跳过a列筛选
      is.na(r4) | f %in% r4, # r4为NA则跳过f列筛选
      is.na(r2) | b > r2, # r2为NA则跳过b列下限筛选
      is.na(r3) | d < r3  # r3为NA则跳过d列上限筛选
    )
  # 可选:添加空子集判断,避免返回NaN
  return(if(nrow(subset) == 0) NA_real_ else mean(subset$c))
}

第二步:修改create_output随机生成含NA的参数

给每个筛选参数增加随机是否启用的逻辑,不需要启用时直接赋值为NA,输出时对应字段自动填充NA:

create_output <- function(na_prob = 0.3) { # na_prob为每个参数被忽略的概率,可自定义调整
  uv <- levels(df$a)
  uv1 <- levels(df$f)
  rgb <- range(df$b)
  rgd <- range(df$d)
  
  # 随机生成r1:(1-na_prob)概率生成有效值,na_prob概率设为NA
  r1 <- if(runif(1) > na_prob) sample(uv, sample(length(uv))) else NA
  # 随机生成r4
  r4 <- if(runif(1) > na_prob) sample(uv1, sample(length(uv1))) else NA
  # 随机生成r2
  r2 <- if(runif(1) > na_prob) runif(1, rgb[1], rgb[2]) else NA
  # 随机生成r3
  r3 <- if(runif(1) > na_prob) runif(1, rgd[1], rgd[2]) else NA
  
  res_mean <- my_subset_mean(r1, r2, r3, r4)
  return(data.frame(
    r1 = toString(r1), 
    r4 = toString(r4), 
    r2 = r2, 
    r3 = r3, 
    my_subset_mean = res_mean
  ))
}

# 批量生成100次结果
out <- do.call(rbind, replicate(100, create_output(), simplify = FALSE))

补充说明

  • 你可以调整na_prob参数的取值,控制筛选条件被随机忽略的概率,比如设为0.5就是每个条件有50%概率不生效
  • 当所有筛选参数都被设为NA时,函数会直接返回全量数据集的c列均值,符合业务逻辑

内容的提问来源于stack exchange,提问作者stats_noob

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 03:57:01