1061 Stimmen

Zeilen mit allen oder einigen NAs (fehlenden Werten) im data.frame entfernen

Ich würde gerne die Zeilen in diesem Datenrahmen entfernen, die:

a) enthalten NA s über alle Spalten hinweg. Nachfolgend finden Sie ein Beispiel für einen Datenrahmen.

             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

Im Grunde 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) enthalten NA s nur in einigen Spalten so kann ich auch dieses Ergebnis erhalten:

             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

1275voto

Joris Meys Punkte 102836

Prüfen Sie auch complete.cases :

> final[complete.cases(final), ]
             gene hsap mmul mmus rnor cfam
2 ENSG00000199674    0    2    2    2    2
6 ENSG00000221312    0    1    2    3    2

na.omit ist besser geeignet, um einfach alle NA 's. complete.cases ermöglicht eine Teilauswahl, indem nur bestimmte Spalten des Datenrahmens einbezogen werden:

> final[complete.cases(final[ , 5:6]),]
             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

Ihre Lösung kann nicht funktionieren. Wenn Sie darauf bestehen, die is.na dann müssen Sie etwas tun wie:

> final[rowSums(is.na(final[ , 5:6])) == 0, ]
             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

sondern mit complete.cases ist sehr viel übersichtlicher und schneller.

312voto

Roman Luštrik Punkte 66681

Essayez na.omit(your.data.frame) . Versuchen Sie, die zweite Frage als weitere Frage zu stellen (aus Gründen der Klarheit).

221voto

lukeA Punkte 51093

tidyr hat eine neue Funktion drop_na :

library(tidyr)
df %>% drop_na()
#              gene hsap mmul mmus rnor cfam
# 2 ENSG00000199674    0    2    2    2    2
# 6 ENSG00000221312    0    1    2    3    2
df %>% drop_na(rnor, cfam)
#              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

102voto

donshikin Punkte 1383

Ich bevorzuge die folgende Methode, um zu prüfen, ob Zeilen irgendwelche NAs enthalten:

row.has.na <- apply(final, 1, function(x){any(is.na(x))})

Dies gibt einen logischen Vektor mit Werten zurück, die angeben, ob eine Zeile NA enthält. Sie können damit feststellen, wie viele Zeilen Sie streichen müssen:

sum(row.has.na)

und lassen sie schließlich fallen

final.filtered <- final[!row.has.na,]

Für das Filtern von Zeilen mit bestimmten Teilen von NAs wird es ein wenig kniffliger (zum Beispiel können Sie 'final[,5:6]' an 'apply' übergeben). Im Allgemeinen scheint die Lösung von Joris Meys eleganter zu sein.

65voto

Pierre L Punkte 27528

Wenn Sie kontrollieren möchten, wie viele NAs für jede Zeile gültig sind, können Sie diese Funktion verwenden. Bei vielen Umfragedatensätzen können zu viele leere Fragebeantwortungen die Ergebnisse verfälschen. Daher werden sie ab einem bestimmten Schwellenwert gelöscht. Mit dieser Funktion können Sie festlegen, wie viele NAs die Zeile haben darf, bevor sie gelöscht wird:

delete.na <- function(DF, n=0) {
  DF[rowSums(is.na(DF)) <= n,]
}

Standardmäßig werden alle NAs eliminiert:

delete.na(final)
             gene hsap mmul mmus rnor cfam
2 ENSG00000199674    0    2    2    2    2
6 ENSG00000221312    0    1    2    3    2

Oder geben Sie die maximal zulässige Anzahl von NAs an:

delete.na(final, 2)
             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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X