Ich möchte die Zeilen in diesem Datenrahmen entfernen, die:
a) enthalten NA
s über alle Spalten. Unten ist mein Beispieldatenrahmen.
gene hsap mmul mmus rnor cfam
1 ENSG00000208234 0 NA NA NA NA
2 ENSG00000199674 0 2 2 2 2
3 ENSG00000221622 0 NA NA NA NA
4 ENSG00000207604 0 NA NA 1 2
5 ENSG00000207431 0 NA NA NA NA
6 ENSG00000221312 0 1 2 3 2
Grundsätzlich möchte ich einen Datenrahmen wie den folgenden erhalten.
gene hsap mmul mmus rnor cfam
2 ENSG00000199674 0 2 2 2 2
6 ENSG00000221312 0 1 2 3 2
b) enthält NA
s nur in einigen Spalten , so dass ich auch dieses Ergebnis erhalten kann:
gene hsap mmul mmus rnor cfam
2 ENSG00000199674 0 2 2 2 2
4 ENSG00000207604 0 NA NA 1 2
6 ENSG00000221312 0 1 2 3 2
final[complete.cases(final),]
?complete.cases
? Wenn ich die Zeilen mit NAs behalten wollte, anstatt sie zu verwerfen?final[ ! complete.cases(final),]
kooperiert nicht ...final
ist der Datenrahmen variabel?Versuchen Sie es
na.omit(your.data.frame)
. Versuchen Sie, die zweite Frage als weitere Frage zu veröffentlichen (aus Gründen der Übersichtlichkeit).quelle
rownames(x) <- NULL
.na.omit()
Zeilen gelöscht werden, dieNA
in einer beliebigen Spalte enthaltentidyr
hat eine neue Funktiondrop_na
:quelle
drop_na
. Zum Beispieldf %>% drop_na()
,df %>% na.omit()
unddrop_na(df)
alle sind im Grunde gleichwertig.na.omit
Fügt zusätzliche Informationen wie die Indizes ausgelassener Fälle hinzu und - was noch wichtiger ist - Sie können keine Spalten auswählen - hierdrop_na
leuchtet.na.omit
mit oder ohne Rohre verwenden, genauso wie Siedrop_na
mit oder ohne Rohre verwenden können.Ich bevorzuge folgende Methode, um zu überprüfen, ob Zeilen NAs enthalten:
Dies gibt einen logischen Vektor mit Werten zurück, die angeben, ob eine NA in einer Zeile vorhanden ist. Sie können damit sehen, wie viele Zeilen Sie löschen müssen:
und sie schließlich fallen lassen
Das Filtern von Zeilen mit einem bestimmten Teil der NAs wird etwas schwieriger (z. B. können Sie 'final [, 5: 6]' mit 'apply' füttern). Im Allgemeinen scheint die Lösung von Joris Meys eleganter zu sein.
quelle
rowSum(!is.na(final))
scheint besser geeignet alsapply()
Eine weitere Option, wenn Sie mehr Kontrolle darüber haben möchten, wie Zeilen als ungültig eingestuft werden, ist
Mit den oben genannten, diese:
Wird:
... wo nur Zeile 5 entfernt wird, da dies die einzige Zeile ist, die NAs für
rnor
UND enthältcfam
. Die boolesche Logik kann dann geändert werden, um bestimmten Anforderungen zu entsprechen.quelle
Wenn Sie steuern möchten, wie viele NAs für jede Zeile gültig sind, versuchen Sie diese Funktion. Bei vielen Umfragedatensätzen können zu viele leere Fragenantworten die Ergebnisse ruinieren. Sie werden also nach einem bestimmten Schwellenwert gelöscht. Mit dieser Funktion können Sie auswählen, wie viele NAs die Zeile haben kann, bevor sie gelöscht wird:
Standardmäßig werden alle NAs entfernt:
Oder geben Sie die maximal zulässige Anzahl von NAs an:
quelle
Wenn Leistung Priorität hat, verwenden Sie
data.table
undna.omit()
mit optionalem Parametercols=
.na.omit.data.table
ist die schnellste in meinem Benchmark (siehe unten), ob für alle Spalten oder für ausgewählte Spalten (OP-Frage Teil 2).Wenn Sie nicht verwenden möchten
data.table
, verwenden Siecomplete.cases()
.Auf einer Vanille
data.frame
,complete.cases
ist schneller alsna.omit()
oderdplyr::drop_na()
. Beachten Sie, dassna.omit.data.frame
dies nicht unterstützt wirdcols=
.Benchmark-Ergebnis
Hier ist ein Vergleich der Basismethoden (blau),
dplyr
(rosa) unddata.table
(gelb) zum Löschen aller oder der Auswahl fehlender Beobachtungen anhand eines fiktiven Datensatzes von 1 Million Beobachtungen von 20 numerischen Variablen mit einer unabhängigen Wahrscheinlichkeit von 5%, dass sie fehlen, und a Teilmenge von 4 Variablen für Teil 2.Ihre Ergebnisse können je nach Länge, Breite und Sparsamkeit Ihres bestimmten Datensatzes variieren.
Beachten Sie die Protokollskala auf der y-Achse.
Benchmark-Skript
quelle
Mit dem Paket dplyr können wir NA wie folgt filtern:
quelle
drop_na()
Dies gibt die Zeilen zurück, die mindestens EINEN Nicht-NA-Wert haben.
Dies gibt die Zeilen zurück, die mindestens ZWEI Nicht-NA-Werte haben.
quelle
Für Ihre erste Frage habe ich einen Code, mit dem ich alle NAs loswerden kann. Vielen Dank für @Gregor, um es einfacher zu machen.
Bei der zweiten Frage ist der Code nur eine Abwechslung zur vorherigen Lösung.
Beachten Sie, dass -5 die Anzahl der Spalten in Ihren Daten ist. Dadurch werden Zeilen mit allen NAs eliminiert, da sich die rowSums zu 5 addieren und sie nach Subtraktion zu Nullen werden. Diesmal ist as.logical notwendig.
quelle
Wir können hierfür auch die Teilmengenfunktion verwenden.
Dies gibt nur die Zeilen an, die in mmul und rnor keine NA haben
quelle
Ich bin ein Synthesizer :). Hier habe ich die Antworten zu einer Funktion zusammengefasst:
quelle
Angenommen,
dat
als Ihr Datenrahmen kann die erwartete Ausgabe mit erreicht werden1.
rowSums
2.
lapply
quelle
Ein Ansatz, der sowohl die allgemeine ist und ergibt ziemlich lesbaren Code ist es, die verwendet werden
filter
Funktion und seine Varianten im dplyr Paket (filter_all
,filter_at
,filter_if
):quelle
Die obige Funktion löscht alle Zeilen aus dem Datenrahmen mit 'NA' in einer beliebigen Spalte und gibt die resultierenden Daten zurück. Wenn Sie für mehrere Werte wie zu überprüfen
NA
und?
änderndart=c('NA')
in Funktion Paramdart=c('NA', '?')
quelle
Ich vermute, dass dies auf diese Weise eleganter gelöst werden könnte:
quelle
NA
. Ich denke, was die OP will, ist:df %>% filter_all(all_vars(!is.na(.)))