2016-04-08 32 views
0

Es ist etwas sehr einfach Ich bin hiermit Werten aus einem anderen Faktor NAs auf einen Faktor ersetzen

d <- data.frame(
g0 = c("A", "B", NA, NA, "C", "C"), 
g1 = LETTERS[1:6]) 
d 
    g0 g1 
1 A A 
2 B B 
3 <NA> C 
4 <NA> D 
5 C E 
6 C F 

Das fehlende ich diesen Code, aber es nicht

d$g0[is.na(d$g0)] <- d$g1[is.na(d$g0)] 

Wunschergebnis funktioniert.

d 
    g0 g1 
1 A A 
2 B B 
3 C C 
4 D D 
5 C E 
6 C F 
+0

Vielen Dank @rawr für die Beantwortung meiner Frage. Ich habe versucht, "ungültiges Faktorniveau zu googeln", aber ich habe ehrlich gesagt nicht verstanden, was passiert ist. Vielleicht sollte ich ins Bett gehen. –

+0

@ HaddE.Nuff, danke. Das ist super hilfreich! –

Antwort

4

Es ist immer hilfreich, sich an die ursprünglichen Designprinzipien hinter Faktoren zu erinnern. Sie waren für kategoriale Variablen gedacht, die einen festen Wert annahmen. So vorstellen, änderte ich dein Beispiel leicht zu sein:

d <- data.frame(color = c("red", "blue", NA, NA, "green", "green"), 
       amount = c("high","low","low","mid","mid","high")) 

> d 
    color amount 
1 red high 
2 blue low 
3 <NA> low 
4 <NA> mid 
5 green mid 
6 green high 

Jetzt völlig macht es Sinn, dass R beschwert sich, wenn wir laufen die folgenden:

> d$color[is.na(d$color)] <- d$amount[is.na(d$color)] 
Warning message: 
In `[<-.factor`(`*tmp*`, is.na(d$color), value = c(3L, 1L, NA, NA, : 
    invalid factor level, NA generated 

denn warum sollten wir jemals eine color von „high“ wollen oder "Mitte"? Das macht keinen Sinn. Das mentale Modell hier ist, dass entweder zwei Faktoren wirklich nichts miteinander zu tun haben, oder wenn sie es tun, sollten ihre Ebenen die gleichen sein. So

levels(d$color) <- c(levels(d$color),"low","mid") 
d$color[is.na(d$color)] <- d$amount[is.na(d$color)] 

dies läuft ohne Probleme:

> d 
    color amount 
1 red high 
2 blue low 
3 low low 
4 mid mid 
5 green mid 
6 green high 

auch wenn das Ergebnis semantisch unsinnig ist.

Natürlich, viele Menschen finden das alles Faktor Niveau Jonglieren irksome und hätte einfach gemacht:

d <- data.frame(color = c("red", "blue", NA, NA, "green", "green"), 
       amount = c("high","low","low","mid","mid","high"), 
       stringsAsFactors = FALSE) 

und dann wird R nicht, was Sie mit bei allen NA Werten füllen, weil sie aren‘ t Faktoren mehr.

+0

Danke joran, da ich meine Daten nicht erzeuge, sondern mit 'factors' besorge. Ich habe mich gefragt, ob es einen Weg gibt, alle' factors' in 'chr' umzuwandeln? Gibt es eine verallgemeinerte Möglichkeit, die Level-Kombination zu verwenden, in der ich die Level von g1 nehme? Es sind nicht nur zwei Ebenen in meinen tatsächlichen Daten. Das war einfach ein einfaches Arbeitsbeispiel. Vielen Dank! –

+0

Ich habe gerade gemerkt, dass der erste Teil meines obigen Kommentars von [@ HaddE.Nuffs Kommentar zu meiner ursprünglichen Frage] beantwortet wird (http://stackoverflow.com/questions/36508897/replace-nas-on-one-factor-with -Werte von einem anderen Faktor? noredirect = 1 # comment60624915_36508897). –

+0

@EricFail Es gibt viele Möglichkeiten. Hier ist einer: 'is_f <- sapply (d, is.factor); d [is_f] <- lapply (d [is_f], as.zeichen) ' – joran