Option 1
Verwenden Sie die Tatsache, dass a data.frame
eine Liste von Spalten ist, und do.call
erstellen Sie dann a neu data.frame
.
do.call(data.frame,lapply(DT, function(x) replace(x, is.infinite(x),NA)))
Option 2 -- data.table
Sie könnten data.table
und verwenden set
. Dies vermeidet internes Kopieren.
DT <- data.table(dat)
invisible(lapply(names(DT),function(.name) set(DT, which(is.infinite(DT[[.name]])), j = .name,value =NA)))
Oder Spaltennummern verwenden (möglicherweise schneller, wenn viele Spalten vorhanden sind):
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
ist das schnellste. Verwenden sapply
verlangsamt die Dinge spürbar.
Verwenden Sie
sapply
undis.na<-
Oder Sie können verwenden (@mnel gutschreiben, dessen Bearbeitung dies ist),
das ist deutlich schneller.
quelle
is.na<-
, dass ein Ergebnis von nicht akzeptiert,lapply
aber eines von akzeptiert werden würdesapply
.is.na<-
Lösung so viel langsamer ist.[<-
mitmapply
ist etwas schneller alssapply
.Mit den Daten von mnel ist das Timing
quelle
Hier ist eine dplyr / tidyverse-Lösung mit der Funktion na_if () :
Beachten Sie, dass dies nur die positive Unendlichkeit durch NA ersetzt. Muss wiederholt werden, wenn auch negative Unendlichkeitswerte ersetzt werden müssen.
quelle
Es gibt eine sehr einfache Lösung für dieses Problem im Hablar-Paket:
Welche einen Datenrahmen mit allen Inf zurückgeben, werden in NA konvertiert.
Timings im Vergleich zu einigen der oben genannten Lösungen. Code: Bibliothek (hablar) Bibliothek (data.table)
Ergebnis:
Scheint, als ob data.table schneller als hablar ist. Hat aber längere Syntax.
quelle
Feng Mai hat oben eine ordentliche Antwort, um negative und positive Unendlichkeiten zu erhalten:
Dies funktioniert gut, aber ein Wort der Warnung ist, hier nicht abs (.) Zu tauschen, um beide Zeilen gleichzeitig zu machen, wie in einem positiv bewerteten Kommentar vorgeschlagen. Es sieht so aus, als würde es funktionieren, ändert jedoch alle negativen Werte im Datensatz in positive! Sie können dies bestätigen:
Für eine Zeile funktioniert dies:
quelle
Eine andere Lösung:
quelle
Sie können auch die praktische Funktion replace_na verwenden: https://tidyr.tidyverse.org/reference/replace_na.html
quelle