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
相关产品推荐
相关产品推荐

