R语言t检验报错:TCGA与GTEx基因表达差异分析代码调试
报错根因拆解
- 列筛选逻辑存在疏漏:原代码通过
TCGA_GTEX_lung[-2]仅删除了第2列study,残留的第1列primary.disease是文本型疾病标注,并非数值型基因表达值。apply逐列循环时,这一文本列会被传入t.test函数,后续计算均值、方差时因类型不匹配返回NA,触发mean、方差计算的警告;最终t.test内部的逻辑判断语句拿到NA值,抛出missing value where TRUE/FALSE needed的报错。 - 硬编码分组逻辑鲁棒性差:虽然当前数据集是前4行TCGA、后2行GTEx,但靠固定行位置拆分样本的方式,一旦后续数据排序变动,就会出现样本分组错配,得到完全错误的检验结果。
修正方案
- 替换列筛选规则:放弃“按列号删除文本列”的方式,直接显式选中4个基因表达列,从输入层面杜绝文本列进入计算流程,从根源消除类型不匹配的问题。
- 替换硬编码分组逻辑:依托study列的样本来源标注匹配分组,替代固定的行位置索引,就算后续数据行序变动,分组也不会出错。
- 可直接运行的修正代码:
# 第一步:校验分组样本量是否符合预期 table(TCGA_GTEX_lung$study) # 第二步:提取纯数值型基因表达矩阵 gene_expr_mat <- TCGA_GTEX_lung[, c("gene1", "gene2", "gene3", "gene4")] # 第三步:逐基因完成两组t检验 GEPVals <- apply(gene_expr_mat, 2, function(each_gene) { # 按study标注提取对应组的表达值,替代固定行位置索引 tcga_expr <- each_gene[TCGA_GTEX_lung$study == "TCGA"] gtex_expr <- each_gene[TCGA_GTEX_lung$study == "GTEx"] # 执行t检验并提取p值 t.test(tcga_expr, gtex_expr)$p.value })
运行注意事项:如果修正代码后仍返回NA,可先用
str(TCGA_GTEX_lung)检查各列存储类型,确认4个基因列是数值型,没有混入字符串格式的异常值即可。
内容的提问来源于stack exchange,提问作者Tah
相关产品推荐
相关产品推荐

