Lassen Sie Zeilen weg, die eine bestimmte Spalte von NA enthalten

129

Ich möchte wissen, wie man NAWerte in einem Datenrahmen weglässt, aber nur in einigen Spalten, die mich interessieren.

Beispielsweise,

DF <- data.frame(x = c(1, 2, 3), y = c(0, 10, NA), z=c(NA, 33, 22))

aber ich möchte nur die Daten weglassen, wo yist NA, deshalb sollte das Ergebnis sein

  x  y  z
1 1  0 NA
2 2 10 33

na.omitscheint zu löschen alle Zeilen enthalten keine NA.

Kann mir jemand bei dieser einfachen Frage helfen?

Aber wenn ich jetzt die Frage ändere wie:

DF <- data.frame(x = c(1, 2, 3,NA), y = c(1,0, 10, NA), z=c(43,NA, 33, NA))

Wenn ich nur weglassen möchte x=naoder z=nawo kann ich die |Funktion in setzen?

user1489975
quelle

Antworten:

79

Sie können die complete.casesFunktion folgendermaßen verwenden und in eine Funktion einfügen:

DF <- data.frame(x = c(1, 2, 3), y = c(0, 10, NA), z=c(NA, 33, 22))

completeFun <- function(data, desiredCols) {
  completeVec <- complete.cases(data[, desiredCols])
  return(data[completeVec, ])
}

completeFun(DF, "y")
#   x  y  z
# 1 1  0 NA
# 2 2 10 33

completeFun(DF, c("y", "z"))
#   x  y  z
# 2 2 10 33

BEARBEITEN: Nur Zeilen ohne NAs zurückgeben

Wenn Sie alle Zeilen mit mindestens einer NAin einer Spalte entfernen möchten , verwenden Sie einfach die complete.casesFunktion direkt nach oben:

DF[complete.cases(DF), ]
#   x  y  z
# 2 2 10 33

Oder wenn completeFunbereits in Ihrem Workflow verankert ist;)

completeFun(DF, names(DF))
BenBarnes
quelle
Können Sie Ihren Ansatz gierig machen? Nehmen Sie alle Spalten, die überhaupt keine NAs haben.
Léo Léopold Hertz 18
1
Du meinst nur Zeilen ohne NAs zurückgeben? Wie completeFun(DF, names(DF))?
BenBarnes
Richtig! Bitte erwägen Sie, es Ihrer Antwort hinzuzufügen, da dies hier häufig vorkommt. - - Ich denke, die Antwort von mnel kann nicht wie Ihre erweitert werden. Ihr Funktionsansatz ist großartig!
Léo Léopold Hertz 18
1
Getan! Danke für den Tipp @ LéoLéopoldHertz Ben
BenBarnes
192

Verwenden is.na

DF <- data.frame(x = c(1, 2, 3), y = c(0, 10, NA), z=c(NA, 33, 22))
DF[!is.na(DF$y),]
mnel
quelle
1
Wie wenden Sie diesen Ansatz gierig auf alle Spalten im Datensatz an? Wenn einer der Spaltenwerte NA ist, überspringen Sie. Ihre Datensatzausgabe ist also nur die zweite Spalte.
Léo Léopold Hertz 18
2
Verwenden Sie, na.omitum gierig alle Zeilen mit NA in einer beliebigen Spalte zu entfernenna.omit(DF)
M. Viking
68

Hadley hat tidyrgerade diese erstaunliche Funktion bekommendrop_na

library(tidyr)
DF %>% drop_na(y)
  x  y  z
1 1  0 NA
2 2 10 33
amrrs
quelle
30

Verwenden Sie 'Teilmenge'

DF <- data.frame(x = c(1, 2, 3), y = c(0, 10, NA), z=c(NA, 33, 22))
subset(DF, !is.na(y))
Rnoob
quelle
9

Es ist möglich na.omitfür data.table:

na.omit(data, cols = c("x", "z"))
Droney
quelle
3
Das cols=Argument ist in der data.table::na.omitBibliothek verfügbar . Nicht die Basis stats::na.omit.
M. Viking
3

Versuche dies:

cc=is.na(DF$y)
m=which(cc==c("TRUE"))
DF=DF[-m,]
Rockswap
quelle
2

Zeile weglassen, wenn eine der beiden spezifischen Spalten enthält <NA>.

DF[!is.na(DF$x)&!is.na(DF$z),]
M. Viking
quelle
1

Versuchen Sie einfach Folgendes:

DF %>% t %>% na.omit %>% t

Es transponiert den Datenrahmen und lässt Nullzeilen weg, die vor der Transposition 'Spalten' waren, und dann transponieren Sie ihn zurück.

Leon Qi
quelle
8
Bitte erklären Sie ein wenig, was los ist.
vonbrand