2017-02-07 4 views
1

Dies ist wahrscheinlich sehr trivial, aber ich kann es nicht herausfinden. Ich schrieb ein R-Skript, das meine Daten (die noch gesammelt werden) bereinigt/organisiert, so dass nach der Datensammlung alles fertig geschrieben ist. Ich stoße auf ein Problem mit Faktorvariablen. Die Rasse/ethnische Variable wird als numerisch gespeichert: 1 = weiß, 2 = schwarz, 3 = asiatisch, 4 = spanisch, 5 = anders. Gerade jetzt die fünf Beobachtungen wie folgt aussehen:Angeben von Faktorvariablen

race <- c(1, 1, 3, 5, 2) 

Ich möchte das Rennen Variable in Faktor konvertieren, so dass ich versucht:

race.f <- factor(race, labels = c("white", "black", "asian", "hisp", 
"native", "other")) 

Aber ich bekomme die Fehlermeldung:

Error in factor(race, labels = c("white", "black", "asian", "hisp", 
"native", : invalid 'labels'; length 6 should be 1 or 4 

Ich vermute, das ist, weil ich sage, es gibt 6 Etiketten, aber in meinem Datensatz gibt es nur Beobachtungen für 4 von den 6 möglichen Ergebnissen. Ich bin mir sicher, dass dies mit dem Level-Argument gelöst werden kann, aber ich kann nicht herausfinden, wann/wo ich es verwenden soll. Ich habe versucht,

race.f <- factor(race, levels = c("white", "black", "asian", "hisp", 
"native", "other")) 

Und es gerade ein Bündel von nationalen Agenturen. Wenn ich zufällig Daten von mindestens einer Person jeder der 6 Ethnien sammle, würde der Code funktionieren, den ich oben gepostet habe. Es gibt jedoch keine Garantie, dass dies passieren wird. Wie gehe ich vor, wenn ich das Skript schreibe, bevor die Daten gesammelt werden? Ich möchte dafür alle möglichen Ergebnisse behandeln. Danke!

Antwort

0

Sie NA bekommen, weil race nicht standardmäßig ein factor ist und dessen Verwendung innerhalb factor() wie es ist, bewirkt, dass NA, da es nicht in der Lage ist, die angegebenen Grenzwerte in race zu finden. Deshalb müssen wir zuerst in race mit den Werten übereinstimmen, um ihre races

Hierzu entspricht, müssen wir wie unten einen Look-up-Vektor haben:

vec <- c("white"=1, "black" = 2, "asian" = 3,"hispanic" = 4, "other" = 5) 

set.seed(100) 
race <- sample(1:5, 8, replace = T) 
# [1] 2 2 3 1 3 3 5 2 

race_new <- names(vec)[match(race, vec)] # match() returns the position where race matched with vec in vec 
factor(race_new, levels = names(vec)) 
# [1] black black asian white asian asian other black 
# Levels: white black asian hispanic other 

@ Imo Vorschlag (prägnanter): oder Sie könnten die Ebene zusammen mit dem Etikett Argumente Faktor:

race.f <- factor(race, levels=1:6, labels = c("white", "black", "asian", 
               "hisp", "native", "other")) 
+1

Oder Sie könnten die Ebene zusammen mit dem Etikett Argumente 'factor' verwenden:' race.f <- Faktor (Rasse, level = 1: 6, Etikett = c (“ weiß "," schwarz "," asiatisch "," hisp "," nativ "," anders ")). – lmo

+0

@lmo empfehlen, als separate Antwort zu veröffentlichen. – Gregor

+0

@Imo Ich habe Ihren Vorschlag hinzugefügt danke! –

0

race Ebene integer sind, die Sie für al definieren müssen l Etikett bei der Erstellung den Faktors:

race.f <- factor(race, 
       levels = 1:6, # one for each label 
       labels = c("white", "black", "asian", 
          "hisp", "native", "other")) 
Verwandte Themen