Ich habe einen Datenrahmen mit einigen numerischen Spalten. Einige Zeilen haben einen Wert von 0, der in der statistischen Analyse als Null betrachtet werden sollte. Was ist der schnellste Weg, um den gesamten 0-Wert in R durch NULL zu ersetzen?
144
Antworten:
Ersetzen aller Nullen durch NA:
Erläuterung
1. Es ist nicht das, durch
NULL
das Sie Nullen ersetzen möchten. Wie es in heißt?'NULL'
,Das ist einzigartig und kann als das uninformativste und leerste Objekt angesehen werden. 1 Dann wird es nicht so überraschend, dass
Das heißt, R reserviert keinen Platz für dieses Nullobjekt. 2 In der Zwischenzeit
?'NA'
sehen wir dasWichtig ist, dass
NA
es die Länge 1 hat, damit R etwas Platz dafür reserviert. Z.B,Außerdem erfordert die Datenrahmenstruktur, dass alle Spalten die gleiche Anzahl von Elementen aufweisen, damit keine "Löcher" (dh
NULL
Werte) vorhanden sein können.Jetzt können Sie Nullen durch
NULL
in einem Datenrahmen ersetzen, indem Sie alle Zeilen, die mindestens eine Null enthalten, vollständig entfernen. Bei der Verwendung von , zum Beispielvar
,cov
odercor
, ist , dass tatsächlich äquivalent ersten Nullen mit dem ErsetzenNA
und Einstellen des Wertes desuse
als"complete.obs"
. In der Regel ist dies jedoch unbefriedigend, da dies zu einem zusätzlichen Informationsverlust führt.2. Anstatt eine Art Schleife auszuführen, verwende ich in der Lösung die
df == 0
Vektorisierung.df == 0
gibt (versuchen Sie es) eine Matrix der gleichen Größe wiedf
mit den EinträgenTRUE
und zurückFALSE
. Außerdem dürfen wir diese Matrix an die Teilmenge übergeben[...]
(siehe?'['
). Obwohl das Ergebnis vondf[df == 0]
vollkommen intuitiv ist, mag es seltsam erscheinen,df[df == 0] <- NA
den gewünschten Effekt zu erzielen. Der Zuweisungsoperator<-
ist in der Tat nicht immer so intelligent und funktioniert auf diese Weise nicht mit einigen anderen Objekten, sondern mit Datenrahmen. siehe?'<-'
.1 Die leere Menge in der Mengenlehre fühlt sich irgendwie verwandt an.
2 Eine weitere Ähnlichkeit mit der Mengenlehre: Die leere Menge ist eine Teilmenge jeder Menge, aber wir reservieren keinen Platz dafür.
quelle
Angenommen, Ihr data.frame ist eine Mischung aus verschiedenen Datentypen und nicht alle Spalten müssen geändert werden.
Um nur die Spalten 12 bis 18 (von insgesamt 21) zu ändern, tun Sie dies einfach
quelle
Ein alternativer Weg ohne die
[<-
Funktion:Ein Beispieldatenrahmen
dat
(schamlos aus der Antwort von @ Chase kopiert):Nullen ersetzt werden kann
NA
durch dieis.na<-
Funktion:quelle
dplyr::na_if()
ist eine Option:quelle
quelle
Da jemand nach der Data.Table-Version gefragt hat und die angegebene data.frame-Lösung nicht mit data.table funktioniert, biete ich die folgende Lösung an.
Verwenden Sie grundsätzlich den
:=
Operator ->DT[x == 0, x := NA]
quelle
for (j in names(DT)); set(DT,which(DT[[j]] == 0),j,NA)
. Sehen Sie hier für eine detailliertere Erörterung von data.table unter Verwendung von Werten zu finden und zu ersetzen.Sie können ersetzen
0
mitNA
nur in numerischen Feldern (dh Dinge wie Faktoren ausschließlich), aber es funktioniert auf einer Säule- für -Spalte - Basis:Mit einer Funktion können Sie dies auf Ihren gesamten Datenrahmen anwenden:
Obwohl Sie die
1:5
durch die Anzahl der Spalten in Ihrem Datenrahmen oder durch ersetzen könnten1:ncol(df)
.quelle
1:5
mit1:ncol(df)
am Ende. Ich wollte die Gleichung nicht zu komplex oder schwer lesbar machen.1:5
zu ändernden Spaltennummern ändern.12:15
Wenn Sie jedoch bestätigen möchten, dass nur numerische Spalten betroffen sind, setzen Sie die zweite Zeile der Funktion in eine if-Anweisung wie folgt :if (is.numeric(col)) { col[col == -1 & is.numeric(col)] <- NA }
.Falls jemand über Google hierher kommt und nach dem Gegenteil sucht (dh wie alle NAs in einem data.frame durch 0 ersetzt werden), lautet die Antwort
ODER
Mit dplyr / tidyverse
quelle