You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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')

错误原因

  1. 向量创建语法错误:vec <- ('A','B','C')不是R中创建字符向量的正确方式,需用c()函数,即vec <- c('A','B','C')。
  2. 核心逻辑错误: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 14:34:56