Wilcoxon检验样本组自定义筛选对比的函数参数优化问询
这里给你调整代码,添加一个target_groups参数来实现仅分析指定分组的功能,同时做了鲁棒性优化,避免指定不存在的分组导致出错:
# 定义需要对比的列组合(也可以做成参数,让函数更灵活) z <- c(2,3,4) v <- 2 s <- sapply(z,'+',v) combination <- mapply(c,z,s,SIMPLIFY = F) # 定义Wilcoxon检验的核心逻辑函数 wilcox.fun <- function(dat) { do.call(rbind, lapply(combination, function(x) { test <- wilcox.test(dat[[x[1]]], dat[[x[2]]], paired=FALSE) data.frame(Test = sprintf('Col %s vs Col %s', x[1], x[2]), W = round(test$statistic,4), p = test$p.value) })) } # 封装成带指定分组参数的主函数 run_wilcox_by_group <- function(dat, target_groups = NULL) { # 处理目标分组:如果为NULL则使用所有分组,否则过滤出存在的有效分组 all_groups <- unique(dat$group) if (!is.null(target_groups)) { # 检查指定分组是否存在,过滤掉不存在的分组 valid_groups <- intersect(target_groups, all_groups) if (length(valid_groups) == 0) { stop("指定的分组在数据集中不存在,请检查输入!") } # 仅保留有效分组的数据 dat_filtered <- dat[dat$group %in% valid_groups, ] } else { dat_filtered <- dat } # 按分组拆分数据并执行检验,最后合并结果 result <- purrr::map_df(split(dat_filtered, dat_filtered$group), wilcox.fun, .id = 'Group') # 将Group列转为数值型(和你预期的输出格式一致) result$Group <- as.integer(result$Group) return(result) } # 示例用法:仅分析分组1和3 result <- run_wilcox_by_group(data, target_groups = c(1, 3)) print(result)
改动说明
- 新增
target_groups参数:默认值为NULL,此时会自动处理数据中所有分组;如果传入指定的分组向量(比如c(1,3)),就只对这些分组执行检验。 - 有效性检查:如果你指定的分组在数据集中不存在,函数会抛出明确的错误提示,避免后续流程莫名报错。
- 输出格式对齐:把
Group列转为数值型,和你给出的预期输出格式完全匹配。
示例输出结构
执行上述示例代码后,输出会是类似这样的结构:
Group Test W p 1 1 Col 2 vs Col 4 28.0000 0.7972416 2 1 Col 3 vs Col 5 16.0000 0.1046143 3 1 Col 4 vs Col 6 24.0000 0.4098076 4 3 Col 2 vs Col 4 28.0000 0.8306189 5 3 Col 3 vs Col 5 22.0000 0.2678295 6 3 Col 4 vs Col 6 27.0000 0.6899648
如果你想让列对比组合也更灵活,可以把combination也做成run_wilcox_by_group的参数,这样调用时可以随时传入不同的列对,不用修改核心函数。
内容的提问来源于stack exchange,提问作者GOGA GOGA
相关产品推荐
相关产品推荐

