使用lapply批量执行pairwise fisher exact test报错排查
批量执行成对Fisher精确检验报错:变量长度不匹配
问题背景
有一个包含分类变量的数据框df,列名包括A、B、C和分类变量gene,逐个执行成对Fisher精确检验可以正常运行:
A <- xtabs(~ A + gene, data = df) pairwise_fisher_test(A ,p.adjust.method = 'fdr') B <- xtabs(~ B + gene, data = df) pairwise_fisher_test(B ,p.adjust.method = 'fdr') C <- xtabs(~ C + gene, data = df) pairwise_fisher_test(C ,p.adjust.method = 'fdr')
但尝试用lapply批量执行时出错:
vec <- ('A','B','C') lapply(vec,function(x){ xtabs(~ x + gene, data = df) pairwise_fisher_test(xtabs(~ x + gene, data = df) , p.adjust.method = 'fdr') })
错误信息:
Error in model.frame.default(formula = ~x + gene, data = df): variable lengths differ (found for 'gene')
错误原因
- 向量创建语法错误:
vec <- ('A','B','C')不是R中创建字符向量的正确方式,需用c()函数,即vec <- c('A','B','C')。 - 核心逻辑错误:
xtabs(~ x + gene, data = df)中的x是字符字符串(比如"A"),而非数据框df中的列名。xtabs会将x视为长度为1的常量变量,和gene的长度不匹配,因此抛出变量长度差异的错误。
解决方法
需要动态构建xtabs的公式,让函数能识别x对应的是df中的列:
方法1:使用reformulate构建公式
vec <- c('A','B','C') lapply(vec, function(x){ # 动态生成公式:~ 目标列 + gene formula <- reformulate(c(x, "gene"), response = NULL) tab <- xtabs(formula, data = df) pairwise_fisher_test(tab, p.adjust.method = 'fdr') })
方法2:拼接字符串后转为公式
vec <- c('A','B','C') lapply(vec, function(x){ # 拼接公式字符串,再转为公式对象 formula_str <- paste0("~ ", x, " + gene") tab <- xtabs(as.formula(formula_str), data = df) pairwise_fisher_test(tab, p.adjust.method = 'fdr') })
内容的提问来源于stack exchange,提问作者user3138373
相关产品推荐
相关产品推荐

