Zeilen löschen, wenn bestimmte Variable = NA ist

Wie rufe ich R-Funktionen auf, wie selektiere ich Daten, ich weiß nicht genau ....

Moderatoren: EDi, jogo

Antworten
schu

Zeilen löschen, wenn bestimmte Variable = NA ist

Beitrag von schu »

Hallo R-Forum,

vorab direkt die Info, dass es sich bei meiner Frage (in meinem Fall) um eine Hausarbeit handelt und es nicht eilt!

Ich habe aus einen reduzierten Datensatz aus einem anderen Datensatz erstellt. Die Reduktion basiert darauf das var1 und var2 = 1 sind (siehe Code unten). Der Datensatz wird auch ohne Fehler erstellt, jedoch hat R die Zeilen in denen für var1 oder var2 = NA steht mit übernommen. Warum ist das so? Kann NA nicht direkt adressiert werden, wie ein numerischer Wert?

Code: Alles auswählen

dat2 <- dat1[(dat1$var1 == "1") &
                        (dat1$var2 == "1"), ]

Folgende Idee, mit der ich gehofft hatte die Zeilen mit "NA" systematisch auszuschließen, hat leider nicht funktioniert (wäre auch zu einfach gewesen ;) ):

Code: Alles auswählen

dat2 <- dat1[(dat1$var1 == "1") &
                        (dat1$var1 != "NA") &
                        (dat1$var2 == "1") &
                        (dat1$var2 != "NA"), ]
Meine Problem:
Ich möchte aus einem Datensatz der aus knapp 9000 Beobachtungen und 10 Variablen besteht, bestimmte Zeilen löschen, wenn eine von zwei Variablen = NA ist. Mit "complete.cases" wird jede Zeile gelöscht in der ein NA auftritt, egal für welche Variable.

Code: Alles auswählen

dat2 <- dat2[complete.cases(dat2), ] # Löscht alle Zeilen in denen ein NA steht, egal bei welcher Variable
Ich hatte die Hoffnung, dass ich mit folgendem Befehl die betroffenen Zeilen in einem Objekt speichern und anschließend vom Datensatz abziehen kann, was aber nicht funktioniert hat:

Code: Alles auswählen

drops <- dat2[(dat2$var1 == "NA") & (dat2$var2 == "NA")]
R gibt folgenden Fehler aus: "Error in `[.data.frame`(dat2, (dat2$var1 == "NA") & : undefined columns selected".

Danke im Voraus für eure Hilfe!
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

Re: Zeilen löschen, wenn bestimmte Variable = NA ist

Beitrag von jogo »

Hallo schu,

man kann nicht per "==" auf NA testen. Man muss is.na() verwenden.
Nachtrag:
"NA" ist ein character mit zwei Buchstaben - also nicht das Kennzeichen für einen nicht vorhanden Wert:

Code: Alles auswählen

is.na("NA")
Bitte liefere den output von:

Code: Alles auswählen

str(dat1) # und
summary(dat1)
Gruß, Jörg
schu

Re: Zeilen löschen, wenn bestimmte Variable = NA ist

Beitrag von schu »

Hallo Jörg,

danke für deine Antwort. Hier die gewünschten Outputs, die im ersten Beitrag verwendeten Bezeichnungen datX und varX sollten nur der Verständlichkeit dienen.

Code: Alles auswählen

str(psid.red2)
'data.frame':	8871 obs. of  10 variables:
 $ age             : int  47 45 39 34 23 22 20 50 39 41 ...
 $ sex             : int  1 2 2 1 1 1 2 1 1 1 ...
 $ edu             : int  9 12 12 NA 12 12 10 16 12 17 ...
 $ race            : int  1 1 1 1 1 1 1 1 1 1 ...
 $ children.hh     : int  1 0 1 2 0 0 1 0 0 0 ...
 $ persons.hh      : int  4 1 2 4 2 1 2 1 1 2 ...
 $ workhours.annual: Factor w/ 2371 levels "",".1","0","1",..: 899 1810 1190 1431 392 586 848 1192 926 899 ...
 $ ind.code        : int  6 6 9 5 4 5 6 9 7 4 ...
 $ prim.activity   : int  1 1 1 1 1 1 1 1 1 1 ...
 $ emp.status      : int  1 1 1 1 1 1 1 1 1 1 ...
Und Nummer zwei:

Code: Alles auswählen

summary(psid.red2)
      age             sex            edu            race        children.hh      persons.hh              workhours.annual    ind.code    
 Min.   :16.00   Min.   :1.00   Min.   : 1.0   Min.   :1.000   Min.   :0.000   Min.   : 1.000   2080             : 312    Min.   :1.000  
 1st Qu.:30.00   1st Qu.:1.00   1st Qu.:12.0   1st Qu.:1.000   1st Qu.:0.000   1st Qu.: 2.000   2000             : 310    1st Qu.:5.000  
 Median :39.00   Median :1.00   Median :12.0   Median :1.000   Median :1.000   Median : 3.000   2040             : 223    Median :8.000  
 Mean   :38.61   Mean   :1.48   Mean   :13.2   Mean   :1.569   Mean   :1.082   Mean   : 3.197   1960             : 146    Mean   :6.927  
 3rd Qu.:47.00   3rd Qu.:2.00   3rd Qu.:15.0   3rd Qu.:2.000   3rd Qu.:2.000   3rd Qu.: 4.000   2499.999999999954: 137    3rd Qu.:9.000  
 Max.   :81.00   Max.   :2.00   Max.   :17.0   Max.   :7.000   Max.   :8.000   Max.   :11.000   (Other)          :6818    Max.   :9.000  
 NA's   :928     NA's   :925    NA's   :2827   NA's   :2909    NA's   :925     NA's   :925      NA's             : 925    NA's   :1618   
 prim.activity   emp.status 
 Min.   :1     Min.   :1    
 1st Qu.:1     1st Qu.:1    
 Median :1     Median :1    
 Mean   :1     Mean   :1    
 3rd Qu.:1     3rd Qu.:1    
 Max.   :1     Max.   :1    
 NA's   :925   NA's   :925
Mein Ziel ist es alle Zeilen zu löschen, in denen "prim.activity" und/oder "emp.status" = NA sind.
bigben
Beiträge: 2781
Registriert: Mi Okt 12, 2016 9:09 am

Re: Zeilen löschen, wenn bestimmte Variable = NA ist

Beitrag von bigben »

schu hat geschrieben: Mi Aug 30, 2017 8:41 amMein Ziel ist es alle Zeilen zu löschen, in denen "prim.activity" und/oder "emp.status" = NA sind.
Du könntest diese Zeilen identifizieren mit

Code: Alles auswählen

which(is.na(psid.id2$prim.activity))
which(is.na(psid.id2$emp.status))
und löschen dann mit

Code: Alles auswählen

psid.id2.naomitted <- psid.id2[ -c(which(is.na(psid.id2$prim.activity)), which(is.na(psid.id2$emp.status))), ]
LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
schu

Re: Zeilen löschen, wenn bestimmte Variable = NA ist

Beitrag von schu »

Danke Bernhard, dein Vorschlag hat mein Problem gelöst.

Mir ist der Umgang von R mit NA-Werten aber noch nicht ganz klar geworden. Wenn "NA" nur ein character mit zwei Buchstaben ist und kein Kennzeichen für einen fehlenden Wert, warum gibt R dann die Anzahl der "NA's" aus, wenn man den summary Befehl verwendet? Das macht auf mich den Eindruck, als wenn die Software schon weiß, dass es sich dabei um fehlende Werte handelt. :?

Existiert denn eine Möglichkeit in R, um fehlende Werte auch als solche zu kennzeichnen? In Stata gibt es diese Möglichkeit meines Wissens nach. Dort wird ein fehlender numerischer Wert als "." angegeben und Stata weiß, dass es sich dabei um ein Missing handelt.

Viele Grüße
Sebastian
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

Re: Zeilen löschen, wenn bestimmte Variable = NA ist

Beitrag von jogo »

Hallo Sebastian,

hier noch zwei Varianten:

Code: Alles auswählen

subset(psid.red2, !(is.na(prim.activity) | is.na(emp.status)))
oder

Code: Alles auswählen

psid.red2[with(psid.red2, !(is.na(prim.activity) | is.na(emp.status))), ]
Gruß, Jörg
jogo
Beiträge: 2086
Registriert: Fr Okt 07, 2016 8:25 am

Re: Zeilen löschen, wenn bestimmte Variable = NA ist

Beitrag von jogo »

schu hat geschrieben: Mi Aug 30, 2017 10:06 am Mir ist der Umgang von R mit NA-Werten aber noch nicht ganz klar geworden. Wenn "NA" nur ein character mit zwei Buchstaben ist und kein Kennzeichen für einen fehlenden Wert, warum gibt R dann die Anzahl der "NA's" aus, wenn man den summary Befehl verwendet? Das macht auf mich den Eindruck, als wenn die Software schon weiß, dass es sich dabei um fehlende Werte handelt. :?
Richtig, der Output von str() und besonders von summary() zeigt, dass es sich wirklich um NAs handelt - dies war in Deiner ersten Nachricht nicht deutlich zu erkennen, weil die entsprechenden Daten fehlten (und Du hattest in Deiner ersten Nachricht im letzten Code-Stückchen "NA" geschrieben). Deshalb von mir die entsprechende Anmerkung, um folgenden Unterschied darzulegen:

Code: Alles auswählen

is.na("NA")
is.na(NA)
Existiert denn eine Möglichkeit in R, um fehlende Werte auch als solche zu kennzeichnen? In Stata gibt es diese Möglichkeit meines Wissens nach. Dort wird ein fehlender numerischer Wert als "." angegeben und Stata weiß, dass es sich dabei um ein Missing handelt.
ja, R kennt NA, Inf, NaN. Du kannst sogar selber NAs einsetzen:

Code: Alles auswählen

x <- c(4, 1, NA, 2, NA) 
is.na(x)
x[!is.na(x)]
Viele Grüße
Jörg
bigben
Beiträge: 2781
Registriert: Mi Okt 12, 2016 9:09 am

Re: Zeilen löschen, wenn bestimmte Variable = NA ist

Beitrag von bigben »

schu hat geschrieben: Mi Aug 30, 2017 10:06 amDanke Bernhard, dein Vorschlag hat mein Problem gelöst.
Das freut mich.
schu hat geschrieben: Mi Aug 30, 2017 10:06 amWenn "NA" nur ein character mit zwei Buchstaben ist und kein Kennzeichen
Die Anführungszeichen machen den Unterschied. NA ist ein fehlender Wert, "NA" ist ein String aus zwei Buchstaben.
schu hat geschrieben: Mi Aug 30, 2017 10:06 amwarum gibt R dann die Anzahl der "NA's" aus, wenn man den summary Befehl verwendet?
Es gibt die Zahl der NA (ohne Anführungszeichen) aus, nicht die der "NA" (mit Anführungszeichen).

LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Antworten