R语言构建含分类参数的随机网格并批量计算子集均值的实现方法
实现步骤及代码
第一步:修改自定义函数适配NA值
原函数遇到r1=NA时筛选逻辑会失效,先调整函数逻辑兼容NA场景,同时处理空子集返回异常的问题:
library(dplyr) library(purrr) # 用于批量映射计算,不需要可换下方base R方案 my_subset_mean <- function(r1, r2, r3){ if (is.na(r1)) { # r1为NA时不筛选a列 subset <- df %>% filter(b > r2, d < r3) } else { # 将逗号分隔的r1字符串拆分为筛选用的向量 r1_vec <- unlist(strsplit(r1, ",\\s*")) subset <- df %>% filter(a %in% r1_vec, b > r2, d < r3) } # 加na.rm参数避免空子集/缺失值返回异常 return(mean(subset$c, na.rm = TRUE)) }
第二步:生成指定格式的参数网格
set.seed(123) # 设随机种子方便结果复现 n_row <- 100 # 自定义网格行数,可按需调整 a_levels <- levels(df$a) my_grid <- data.frame( r2 = runif(n_row, min = 0, max = 5), # 0-5的随机r2 r3 = runif(n_row, min = 0, max = 5), # 0-5的随机r3 r1 = character(n_row), stringsAsFactors = FALSE ) # 生成随机r1参数 for (i in 1:n_row) { # 10%概率生成NA,可自行调整概率 if (runif(1) < 0.1) { my_grid$r1[i] <- NA_character_ } else { # 随机选1到全量个a的水平值 pick_k <- sample(1:length(a_levels), size = 1) pick_vals <- sample(a_levels, size = pick_k) # 拼接为逗号分隔的字符串,和示例格式一致 my_grid$r1[i] <- paste(pick_vals, collapse = ", ") } }
第三步:批量计算生成最终结果
方案1:purrr批量映射(代码更简洁)
final_answer <- my_grid %>% mutate( my_subset_mean = pmap_dbl(list(r1, r2, r3), my_subset_mean) )
方案2:base R实现(不需要额外装包)
final_answer <- my_grid final_answer$my_subset_mean <- mapply( FUN = my_subset_mean, r1 = final_answer$r1, r2 = final_answer$r2, r3 = final_answer$r3 )
如果遇到筛选后子集为空返回NaN的情况,可以在函数里加判断逻辑,将空子集的返回值替换为NA或者其他自定义数值即可。
内容的提问来源于stack exchange,提问作者stats_noob
相关产品推荐
相关产品推荐

