Option 1
Utilisez le fait que a data.frame
est une liste de colonnes, puis utilisez do.call
pour recréer un fichier data.frame
.
do.call(data.frame,lapply(DT, function(x) replace(x, is.infinite(x),NA)))
Option 2 -- data.table
Vous pouvez utiliser data.table
et set
. Cela évite une copie interne.
DT <- data.table(dat)
invisible(lapply(names(DT),function(.name) set(DT, which(is.infinite(DT[[.name]])), j = .name,value =NA)))
Ou en utilisant des numéros de colonne (peut-être plus rapide s'il y a beaucoup de colonnes):
for (j in 1:ncol(DT)) set(DT, which(is.infinite(DT[[j]])), j, NA)
Timings
# 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
est le plus rapide. L'utilisation sapply
ralentit sensiblement les choses.
Utiliser
sapply
etis.na<-
Ou vous pouvez utiliser (attribuer le crédit à @mnel, dont il s'agit de modifier),
ce qui est nettement plus rapide.
la source
is.na<-
n'accepterait pas un résultatlapply
mais en accepterait unsapply
.is.na<-
solution est tellement plus lente.[<-
avecmapply
est un peu plus rapide quesapply
.Avec les données de mnel, le timing est
la source
Voici une solution dplyr / tidyverse utilisant la fonction na_if () :
Notez que cela ne remplace que l'infini positif par NA. Il faut répéter si les valeurs infinies négatives doivent également être remplacées.
la source
Il existe une solution très simple à ce problème dans le package hablar:
Qui renvoient une trame de données avec tous les Inf sont convertis en NA.
Timings par rapport à certaines solutions ci-dessus. Code: bibliothèque (hablar) bibliothèque (data.table)
Résultat:
On dirait que data.table est plus rapide que hablar. Mais a une syntaxe plus longue.
la source
Feng Mai a une réponse tidyverse ci-dessus pour obtenir des infinis négatifs et positifs:
Cela fonctionne bien, mais un mot d'avertissement est de ne pas permuter en abs (.) Ici pour faire les deux lignes à la fois comme cela est proposé dans un commentaire voté. Il semblera que cela fonctionne, mais change toutes les valeurs négatives de l'ensemble de données en positives! Vous pouvez confirmer avec ceci:
Pour une ligne, cela fonctionne:
la source
Une autre solution:
la source
Vous pouvez également utiliser la fonction pratique replace_na: https://tidyr.tidyverse.org/reference/replace_na.html
la source