gpt4 book ai didi

r - 从 R 数据帧中清理 `Inf` 值

转载 作者:行者123 更新时间:2023-12-03 04:55:31 25 4
gpt4 key购买 nike

在 R 中,我有一个操作,可以在转换数据帧时创建一些 Inf 值。

我想将这些 Inf 值转换为 NA 值。我的代码对于大数据来说很慢,有没有更快的方法?

假设我有以下数据框:

dat <- data.frame(a=c(1, Inf), b=c(Inf, 3), d=c("a","b"))

以下工作在单个案例中:

 dat[,1][is.infinite(dat[,1])] = NA

所以我用以下循环概括了它

cf_DFinf2NA <- function(x)
{
for (i in 1:ncol(x)){
x[,i][is.infinite(x[,i])] = NA
}
return(x)
}

但我不认为这真正利用了 R 的力量。

最佳答案

选项 1

利用 data.frame 是列列表这一事实,然后使用 do.call 重新创建 data.frame

do.call(data.frame,lapply(DT, function(x) replace(x, is.infinite(x),NA)))

选项 2 -- data.table

您可以使用data.tableset。这避免了一些内部复制。

DT <- data.table(dat)
invisible(lapply(names(DT),function(.name) set(DT, which(is.infinite(DT[[.name]])), j = .name,value =NA)))

或者使用列号(如果有很多列,可能会更快):

for (j in 1:ncol(DT)) set(DT, which(is.infinite(DT[[j]])), j, NA)

时间

# some `big(ish)` data
dat <- data.frame(a = rep(c(1,Inf), 1e6), b = rep(c(Inf,2), 1e6),
c = rep(c('a','b'),1e6),d = rep(c(1,Inf), 1e6),
e = rep(c(Inf,2), 1e6))
# create data.table
library(data.table)
DT <- data.table(dat)

# replace (@mnel)
system.time(na_dat <- do.call(data.frame,lapply(dat, function(x) replace(x, is.infinite(x),NA))))
## user system elapsed
# 0.52 0.01 0.53

# is.na (@dwin)
system.time(is.na(dat) <- sapply(dat, is.infinite))
# user system elapsed
# 32.96 0.07 33.12

# modified is.na
system.time(is.na(dat) <- do.call(cbind,lapply(dat, is.infinite)))
# user system elapsed
# 1.22 0.38 1.60


# data.table (@mnel)
system.time(invisible(lapply(names(DT),function(.name) set(DT, which(is.infinite(DT[[.name]])), j = .name,value =NA))))
# user system elapsed
# 0.29 0.02 0.31

data.table 是最快的。使用 sapply 会明显减慢速度。

关于r - 从 R 数据帧中清理 `Inf` 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12188509/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com