Ich habe einen Datenrahmen und einige Spalten haben NA
Werte.
Wie ersetze ich diese NA
Werte durch Nullen?
r
dataframe
na
missing-data
imputation
Renato Dinhani
quelle
quelle
Antworten:
Siehe meinen Kommentar in @ gsk3 Antwort. Ein einfaches Beispiel:
Es besteht keine Notwendigkeit, sich zu bewerben
apply
. =)BEARBEITEN
Sie sollten sich auch das
norm
Paket ansehen . Es hat viele nette Funktionen für die Analyse fehlender Daten. =)quelle
df[19:28][is.na(df[19:28])] <- 0
Die mit dplyr hybridisierten Optionen sind jetzt etwa 30% schneller als die Neuzuweisung der Base R-Teilmenge. Auf einem 100M-Datenpunkt
mutate_all(~replace(., is.na(.), 0))
läuft der Datenrahmen eine halbe Sekunde schneller als die Basis-R-d[is.na(d)] <- 0
Option. Was man konkret vermeiden möchte, ist die Verwendung einesifelse()
oder einesif_else()
. (Die vollständige 600-Studienanalyse dauerte mehr als 4,5 Stunden, hauptsächlich aufgrund der Einbeziehung dieser Ansätze.) Die vollständigen Ergebnisse finden Sie in den folgenden Benchmark-Analysen.Wenn Sie mit massivem Datenrahmen zu kämpfen hat ,
data.table
ist die schnellste Möglichkeit , alle: 40% schneller als der Standard - Base - R - Ansatz. Außerdem werden die vorhandenen Daten geändert, sodass Sie effektiv mit fast doppelt so vielen Daten gleichzeitig arbeiten können.Eine Zusammenfassung anderer hilfreicher Tidyverse-Ersatzansätze
Standortlich:
mutate_at(c(5:10), ~replace(., is.na(.), 0))
mutate_at(vars(var5:var10), ~replace(., is.na(.), 0))
mutate_at(vars(contains("1")), ~replace(., is.na(.), 0))
contains()
, versuchen Sieends_with()
,starts_with()
mutate_at(vars(matches("\\d{2}")), ~replace(., is.na(.), 0))
Bedingt:
(Nur einen Typ ändern und andere Typen in Ruhe lassen.)
mutate_if(is.integer, ~replace(., is.na(.), 0))
mutate_if(is.numeric, ~replace(., is.na(.), 0))
mutate_if(is.character, ~replace(., is.na(.), 0))
Die vollständige Analyse -
Aktualisiert für dplyr 0.8.0: Funktionen verwenden
~
Symbole im Purrr-Format : Ersetzen veralteterfuns()
Argumente.Getestete Ansätze:
Der Code für diese Analyse:
Zusammenfassung der Ergebnisse
Boxplot der Ergebnisse
Farbcodiertes Streudiagramm der Versuche (mit y-Achse auf einer logarithmischen Skala)
Ein Hinweis zu den anderen Leistungsträgern
Wenn die Datensätze größer werden, hat sich Tidyr 's
replace_na
historisch nach vorne zurückgezogen. Mit der aktuellen Sammlung von 100 Millionen Datenpunkten, die durchlaufen werden müssen, ist die Leistung fast genauso gut wie bei einer Base R For Loop. Ich bin gespannt, was bei unterschiedlich großen Datenrahmen passiert.Weitere Beispiele für die Varianten
mutate
undsummarize
_at
und_all
finden Sie hier: https://rdrr.io/cran/dplyr/man/summarise_all.html Außerdem habe ich hier hilfreiche Demonstrationen und Sammlungen von Beispielen gefunden: https: //blog.exploratory. io / dplyr-0-5-is-awesome-heres-why-be095fd4eb8aZuschreibungen und Wertschätzungen
Mit besonderem Dank an:
local()
und (auch mit Franks geduldiger Hilfe) die Rolle zu verstehen, die stiller Zwang bei der Beschleunigung vieler dieser Ansätze spielt.coalesce()
Funktion hinzuzufügen und die Analyse zu aktualisieren.data.table
Funktionen gut genug herauszufinden, um sie endlich in die Aufstellung aufzunehmen.is.numeric()
wirklich testet.(Natürlich greifen Sie bitte zu ihnen und geben Sie ihnen auch Stimmen, wenn Sie diese Ansätze nützlich finden.)
Hinweis zu meiner Verwendung von Numerics: Wenn Sie ein reines Integer-Dataset haben, werden alle Ihre Funktionen schneller ausgeführt. Bitte beachten Sie alexiz_laz Arbeit für weitere Informationen. IRL, ich kann mich nicht erinnern, auf einen Datensatz gestoßen zu sein, der mehr als 10-15% Ganzzahlen enthält. Daher führe ich diese Tests für vollständig numerische Datenrahmen aus.
Verwendete Hardware 3,9 GHz CPU mit 24 GB RAM
quelle
df1[j][is.na(df1[j])] = 0
ist falsch, sollte seindf1[[j]][is.na(df1[[j]])] = 0
forLp_Sbst
scheint nicht so, als ob jemand darüber nachdenken sollte, sich ihm zu nähernforLp_smplfSbst
coalesce()
Option hinzugefügt und immer wieder ausgeführt. Vielen Dank für den Anstoß zum Update.Für einen einzelnen Vektor:
Machen Sie für einen data.frame eine Funktion aus dem oben genannten und dann
apply
zu den Spalten.Bitte geben Sie beim nächsten Mal ein reproduzierbares Beispiel an, wie hier beschrieben:
Wie macht man ein gutes reproduzierbares R-Beispiel?
quelle
is.na
ist eine generische Funktion und verfügt über Methoden für Objekte derdata.frame
Klasse. also wird dieser auch aufdata.frame
s funktionieren !methods(is.na)
zum ersten Mal rannte , war ich wie was?!? . Ich liebe es, wenn so etwas passiert! =)dplyr Beispiel:
Hinweis: Dies funktioniert für jede ausgewählte Spalte. Wenn dies für alle Spalten erforderlich ist , lesen Sie die Antwort von @reidjax mit mutate_each .
quelle
Wenn wir versuchen,
NA
s beim Exportieren zu ersetzen , beispielsweise beim Schreiben in csv, können wir Folgendes verwenden:quelle
Ich weiß, dass die Frage bereits beantwortet ist, aber auf diese Weise könnte es für einige nützlicher sein:
Definieren Sie diese Funktion:
Wann immer Sie NAs in einem Vektor in Nullen konvertieren müssen, können Sie Folgendes tun:
quelle
Mit
dplyr
0.5.0 können Siecoalesce
Funktionen verwenden, die auf einfache Weise in die%>%
Pipeline integriert werden könnencoalesce(vec, 0)
. Dies ersetzt alle NAsvec
durch 0:Angenommen, wir haben einen Datenrahmen mit
NA
s:quelle
Allgemeineren Ansatz der Verwendung
replace()
in Matrix oder Vektor ersetzenNA
zu0
Zum Beispiel:
Dies ist auch eine Alternative zur Verwendung
ifelse()
indplyr
quelle
levels(A$x) <- append(levels(A$x), "notAnswered") A$x <- replace(A$x,which(is.na(A$x)),"notAnswered")
which
wird hier nicht benötigt, können Sie verwendenx1 <- replace(x,is.na(x),1)
.NA
sie0
in nur einer bestimmten Spalte in einem großen Datenrahmen zu ersetzen , und diese Funktionreplace()
hat am effektivsten und gleichzeitig am einfachsten funktioniert .Es ist auch möglich zu verwenden
tidyr::replace_na
.quelle
Ein weiteres Beispiel für das imputeTS- Paket:
quelle
Wenn Sie NAs in Faktorvariablen ersetzen möchten, kann dies hilfreich sein:
Es transformiert einen Faktorvektor in einen numerischen Vektor und fügt eine weitere künstliche numerische Faktorebene hinzu, die dann mit einer zusätzlichen "NA-Ebene" Ihrer Wahl in einen Faktorvektor zurücktransformiert wird.
quelle
Hätte den Beitrag von @ ianmunoz kommentiert, aber ich habe nicht genug Ruf. Sie können kombinieren
dplyr
‚smutate_each
undreplace
Betreuung von nehmen ,NA
um0
Ersatz. Verwenden des Datenrahmens aus der Antwort von @ aL3xa ...Wir verwenden hier die Standardbewertung (SE), weshalb wir den Unterstrich "
funs_
." Wir verwenden auchlazyeval
'sinterp
/~
und die.
Referenzen "alles, mit dem wir arbeiten", dh den Datenrahmen. Jetzt gibt es Nullen!quelle
Sie können verwenden
replace()
Zum Beispiel:
quelle
NA
s in Ihrem Vektor kennen. Es ist gut für kleine Vektoren wie in Ihrem Beispiel.x1 <- replace(x,is.na(x),1)
funktioniert ohne explizite Auflistung der Indexwerte.Eine weitere
dplyr
Pipe-kompatible Option mit einertidyr
Methodereplace_na
, die für mehrere Spalten funktioniert:Sie können sich leicht auf z. B. numerische Spalten beschränken:
quelle
Die dafür vorgesehene Funktion (
nafill
/setnafill
) ist in der aktuellendata.table
Version enthaltenquelle
Diese einfache Funktion aus Datacamp könnte helfen:
Dann
quelle
Eine einfache Möglichkeit , es zu schreiben , ist mit
if_na
vonhablar
:was zurückgibt:
quelle
So ersetzen Sie alle NAs in einem Datenrahmen:
df %>% replace(is.na(.), 0)
quelle
Wenn Sie nach dem Ändern der NAs in einer bestimmten Spalte in diesem Fall einen neuen Namen zuweisen möchten, können Sie dies auch tun
quelle