如何移除数据框中的无限值?替换Inf为NA报错排查与解决
解决数据框中Inf值替换为NA的报错问题
先看你的示例数据,运行log2(exp)后会出现-Inf(因为有0值,log2(0)的结果是负无穷):
exp <- structure(list(TCGA.4A.A93W.01A = c(48.3424, 2.2117, 0), TCGA.A4.7734.01A = c(43.8689, 1.8499, 50.74), TCGA.A4.7997.01A = c(70.2027, 86.9447, 1.2938)), row.names = c("A1BG", "A1CF", "A2BP1"), class = "data.frame") exp_log <- as.data.frame(log2(exp)) exp_log # TCGA.4A.A93W.01A TCGA.A4.7734.01A TCGA.A4.7997.01A # A1BG 5.600380 5.451438 6.130338 # A1CF 1.144729 0.875044 6.440648 # A2BP1 -Inf 5.673150 0.373060
你原来的代码报错原因很简单:!is.finite(unlist(exp))生成的是一个长度等于数据框总元素数的逻辑向量(这里是9个元素),但你直接把它放在行索引位置exp[..., ],R会尝试把这个向量循环匹配数据框的行数(3行),导致出现超出范围的索引请求,所以抛出non-existent rows not allowed错误。
下面给你几种可行的解决方法:
方法一:基础R矩阵索引法
先定位所有非有限值的位置,再用矩阵索引赋值NA:
exp_log <- as.data.frame(log2(exp)) # 找出所有非有限值的行列位置 inf_pos <- which(!is.finite(exp_log), arr.ind = TRUE) # 替换为NA exp_log[inf_pos] <- NA
方法二:apply逐列处理
对数据框每一列单独替换非有限值:
exp_log <- as.data.frame(log2(exp)) exp_log <- data.frame(lapply(exp_log, function(x) { x[!is.finite(x)] <- NA x }))
方法三:dplyr快速处理
如果习惯用tidyverse工具链,用across批量处理所有列:
library(dplyr) exp_log <- exp %>% mutate(across(everything(), ~log2(.x))) %>% mutate(across(everything(), ~replace(.x, !is.finite(.x), NA)))
内容的提问来源于stack exchange,提问作者melolilili
相关产品推荐
相关产品推荐

