如何从 Dataframe 中删除无限值?

z31licg0  于 2023-02-06  发布在  其他
关注(0)|答案(4)|浏览(196)

我想将 Dataframe exp中的Inf值指定为NA

exp <- as.data.frame(log2(exp))
exp[!is.finite(unlist(exp)),] <- NA

追溯:

Error in `[<-.data.frame`(`*tmp*`, !is.finite(unlist(exp)), , value = NA) : 
  non-existent rows not allowed

数据:

#> dput(exp[1:3,1:3])
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")
webghufk

webghufk1#

您的示例 Dataframe 没有任何非有限值,但如果它有,您可以这样做:

df[abs(df)==Inf] <- NA

输入:

df=data.frame(val1 = c(10, 20, Inf),val2 = c(3, -Inf, Inf))

输出:

val1 val2
1   10    3
2   20   NA
3   NA   NA
iecba09b

iecba09b2#

替换帧中的所有值可通过以下方式完成:

expr
#       TCGA.4A.A93W.01A TCGA.A4.7734.01A TCGA.A4.7997.01A
# A1BG          5.595217        5.4551266        6.1334546
# A1CF          1.145156        0.8874473        6.4420262
# A2BP1             -Inf        5.6650516        0.3716146
expr[] <- lapply(expr, function(z) replace(z, !is.finite(z), z[NA][1]))
expr
#       TCGA.4A.A93W.01A TCGA.A4.7734.01A TCGA.A4.7997.01A
# A1BG          5.595217        5.4551266        6.1334546
# A1CF          1.145156        0.8874473        6.4420262
# A2BP1               NA        5.6650516        0.3716146
dgtucam1

dgtucam13#

is.infinite()没有用于 Dataframe 的方法,因此强制使用矩阵进行索引:

exp[is.infinite(as.matrix(exp))] <- NA

exp
TCGA.4A.A93W.01A TCGA.A4.7734.01A TCGA.A4.7997.01A
A1BG          5.595217        5.4551266        6.1334546
A1CF          1.145156        0.8874473        6.4420262
A2BP1               NA        5.6650516        0.3716146
v2g6jxz6

v2g6jxz64#

您可以使用{dplyr}执行此操作

library(dplyr)

d <- structure(list(a = c(1, Inf, Inf, Inf, 2), b = c(Inf, 3, -Inf, -Inf, 3)), class = "data.frame", row.names = c(NA, -5L))

d %>% mutate(across(everything(), ~if_else(is.finite(.x), .x, NA_real_)))
#>    a  b
#> 1  1 NA
#> 2 NA  3
#> 3 NA NA
#> 4 NA NA
#> 5  2  3

创建于2023年1月31日,使用reprex v2.0.2

相关问题