对数据框逐行做t检验计算-log10(p值)时出现缺失值报错如何解决
报错原因及解决方法
核心报错原因
你当前的代码存在两个核心问题:
apply(df.test, 1, ...)按行读取数据时,由于数据框前两列Mod.sites、Gene.names为字符类型,apply会强制将整行所有值转为字符向量,传入t检验的不是数值型数据,直接导致运算失败- 缺少容错逻辑,当某行数据不符合t检验要求(比如方差为0)时,会直接中断运行抛出错误
修正后可运行代码
写法1:调整原apply逻辑
library(dplyr) control <- c("TMT126", "TMT127N", "TMT128N") condition1 <- c("TMT128C", "TMT129C") # 函数增加数值转换和容错处理 my.pvalue2 <- function(x){ x <- as.numeric(x) tryCatch({ pValue <- -log10(t.test(x[condition1],x[control])$p.value) return(pValue) }, error = function(e) { return(NA_real_) }) } df.test.1 <- df.test %>% mutate( `minus Log10(p-value:condition1)` = apply(across(all_of(c(control, condition1))),1, my.pvalue2) )
写法2:更符合tidyverse风格的行运算写法
library(dplyr) control <- c("TMT126", "TMT127N", "TMT128N") condition1 <- c("TMT128C", "TMT129C") df.test.1 <- df.test %>% rowwise() %>% mutate( `minus Log10(p-value:condition1)` = tryCatch({ -log10(t.test(c_across(all_of(condition1)), c_across(all_of(control)))$p.value) }, error = function(e) NA_real_) ) %>% ungroup()
改动说明
- 仅选中参与t检验的control和condition1组对应列参与运算,排除了字符列的干扰
- 新增
tryCatch容错逻辑,遇到无法完成t检验的行时返回NA,不会中断整体运算 - rowwise写法用
c_across按行提取指定列数值,逻辑更清晰,也避免了apply强制类型转换的坑
内容的提问来源于stack exchange,提问作者Chemist learns to code
相关产品推荐
相关产品推荐

