在R中基于首列变量对多列执行wilcox.test并添加p值与校正p值
问题解决:为分组变量添加Wilcoxon检验p值及BH校正值
先看原始数据:
df <- data.frame( variable=c(2.4860651, -0.68863024, 2.63530974, -2.95754943, 1.67945091, 2.63530974, 4.79002539, 2.32575938, 3.57236441, -0.364825998, -2.00646016, -3.12380516, 0.69307013, -5.65846824, 0.45632519, 2.08978142), A=c(0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0), B=c(1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0), C=c(0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1), D=c(1, 1, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0), E=c(0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0), F=c(0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1))
需求是:对A到F的每一列,用该列的0/1分组,对variable列做Wilcoxon秩和检验,然后在原数据底部添加两行——第一行是各列的检验p值,第二行是BH校正后的p值。
你之前的代码报错,核心问题有两个:一是wilcox.test的公式写反了(应该是variable ~ .x,而非.x ~ variable);二是处理p值校正时的结构逻辑错误,直接对整个data.frame用p.adjust会导致格式混乱,后续行绑定和变量替换也有问题。
以下是修正后的可运行代码:
library(dplyr) # 1. 计算每列的Wilcoxon检验p值 p_vals <- df %>% summarise(across(!variable, ~wilcox.test(variable ~ .x, exact = NULL)$p.value)) # 2. 对p值做BH校正,转换为和p_vals一致的data.frame格式 p_adjusted <- p.adjust(unlist(p_vals), method = "BH") %>% t() %>% as.data.frame() %>% setNames(names(p_vals)) # 3. 将p值、校正p值行添加到原数据,并设置对应标签 result <- df %>% bind_rows( mutate(p_vals, variable = "p.value"), mutate(p_adjusted, variable = "p.adjust") )
运行后得到的结果完全符合你的预期:比如列A因分组样本量过小,p值和校正值均为1;其他列的p值和校正结果也与你给出的示例匹配。
内容的提问来源于stack exchange,提问作者Sylvia Rodriguez
相关产品推荐
相关产品推荐

