Frage

Kann mir jemand erklären, warum logische Auswertungen, die sich auf NA auflösen, falsche Zeilen in vektorvergleichsbasierten Teilmengen erzeugen?Beispielsweise:

employee <- c("Big Shot CEO", "Programmer","Intern","Guy Who Got Fired Last Week")
salary <-   c(      10000000,        50000,       0,                           NA)
emp_salary <- data.frame(employee,salary)

# how many employees paid over 100K?
nrow(emp_salary[salary>100000,]) # Returns 2 instead of 1 -- why?

emp_salary[salary>100000,]
# returns a bogus row of all NA's (not "Guy Who Got Fired")
#        employee salary
# 1  Big Shot CEO  1e+07
# NA         <NA>   <NA>

salary[salary>100000]
# returns:
# [1] 1e+07    NA

NA > 100000 #returns NA

Was ist angesichts dieses unerwarteten Verhaltens die bevorzugte Methode, um Mitarbeiter zu zählen, die im obigen Beispiel über 100K verdienen?

War es hilfreich?

Lösung

Zuallererst wollen Sie wahrscheinlich nicht cbind() erstens - das zwingt alle Ihre Variablen zum Zeichen.

 emp_salary <- data.frame(employee,salary)

Zwei mögliche Lösungen:

  • subset schließt automatisch Fälle aus, in denen das Kriterium ist NA:

nrow(subset(emp_salary,salary>1e5))
  • zählen Sie die Ergebnisse direkt und verwenden Sie na.rm=TRUE:

sum(salary>1e5,na.rm=TRUE)

Was die Logik hinter den falschen Reihen betrifft:

  • bigsal <- salary>1e5 ist ein logischer Vektor, der enthält NAs, wie es muss (weil es keine Möglichkeit gibt zu wissen, ob ein NA wert das Kriterium erfüllt oder nicht).
  • beim Indizieren der Zeilen eines Datenrahmens mit einem logischen Vektor, der enthält NAs, dies ist wahrscheinlich das hervorstechendste Dokument (von help("[")):

    Beim Extrahieren wählt ein numerischer, logischer oder Zeichenindex 'NA' ein unbekanntes Element aus und gibt daher 'NA' im entsprechenden Element eines logischen, ganzzahligen, numerischen, komplexen oder Zeichenergebnisses und 'NULL' für eine Liste zurück.

(Ich habe gesucht help("[.data.frame") und konnte nichts Nützlicheres sehen.)

Zu beachten ist, dass R nach Abschluss der Indizierung nicht mehr weiß, dass der logische Vektor aus dem erstellt wurde salary spalte, es gibt also keine Möglichkeit, das zu tun, was Sie möchten, nämlich die Werte in den anderen Spalten beizubehalten.Hier ist eine Möglichkeit, über das scheinbar seltsame Verhalten nachzudenken, alle Spalten in der auszufüllen NA zeile mit NAs:wenn R die Zeile vollständig weglässt, würde dies dem Kriterium entsprechen FALSE.Wenn es es behält (und denken Sie daran, dass es nicht nur ein paar Spalten behalten und die anderen löschen kann), dann würde das dem Kriterium entsprechen TRUE.Wenn das Kriterium weder FALSE noch TRUE, dann ist es schwer zu erkennen, welches andere Verhalten Sinn macht ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top