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

对数据框逐行做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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 17:57:05