Opção 1
Use o fato de que a data.frame
é uma lista de colunas e, em seguida, use do.call
para recriar a data.frame
.
do.call(data.frame,lapply(DT, function(x) replace(x, is.infinite(x),NA)))
Opção 2 -- data.table
Você pode usar data.table
e set
. Isso evita algumas cópias internas.
DT <- data.table(dat)
invisible(lapply(names(DT),function(.name) set(DT, which(is.infinite(DT[[.name]])), j = .name,value =NA)))
Ou usando números de coluna (possivelmente mais rápido se houver muitas colunas):
for (j in 1:ncol(DT)) set(DT, which(is.infinite(DT[[j]])), j, NA)
Horários
# 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
é o mais rápido. O uso sapply
torna as coisas perceptivelmente mais lentas.
Use
sapply
eis.na<-
Ou você pode usar (dando crédito a @mnel, cuja edição é),
o que é significativamente mais rápido.
fonte
is.na<-
não aceitaria um resultado de,lapply
mas aceitaria um desapply
.is.na<-
solução é tão mais lenta.[<-
commapply
é um pouco mais rápido do quesapply
.Com os dados da mnel, o momento é
fonte
Aqui está uma solução dplyr / tidyverse usando a função na_if () :
Observe que isso apenas substitui o infinito positivo por NA. É necessário repetir se os valores de infinito negativos também precisarem ser substituídos.
fonte
Existe uma solução muito simples para este problema no pacote hablar:
Que retornam um quadro de dados com todos os Inf são convertidos em NA.
Timings em comparação com algumas soluções acima. Código: library (hablar) library (data.table)
Resultado:
Parece que data.table é mais rápido que hablar. Mas tem sintaxe mais longa.
fonte
Feng Mai tem uma resposta inversa acima para obter infinitos negativos e positivos:
Isso funciona bem, mas uma palavra de advertência não é trocar abs (.) Aqui para fazer as duas linhas ao mesmo tempo, como é proposto em um comentário votado. Vai parecer que funciona, mas altera todos os valores negativos no conjunto de dados para positivos! Você pode confirmar com isto:
Para uma linha, isso funciona:
fonte
Outra solução:
fonte
Você também pode usar a útil função replace_na: https://tidyr.tidyverse.org/reference/replace_na.html
fonte