Frage Wie bringe ich zwei Faktoren mit NAs in eine Variable zusammen?


Ich habe viele Variablen wie folgt:

   Var1    Var2
"Asian"      NA
     NA  "Black"
"White"      NA

Ich möchte sie bequem in diese Form bringen:

   Race
"Asian"
"Black"
"White"

Ich habe versucht, etwas wie:

Race <- ifelse(is.na(Var1), Var2, Var1)

Aber dies konvertiert die Werte in Zahlen für die Ebenen, und die Zahlen stimmen nicht überein (z. B. das ergibt 1, 1, 2). Gibt es eine bequeme Möglichkeit, dies zu tun (idealerweise mit kurzen, selbsterklärenden Code)? (Sie können mit as.character, aber es muss einen besseren Weg geben.)


5
2018-01-12 01:22


Ursprung


Antworten:


Mit einer Zwischenkonvertierung über as.character:
Angenommen, dies sind Ihre Daten:

dat <- data.frame(Var1=c("Asian",NA,"White"),Var2=c(NA,"Black",NA))

do.call(pmax,c(lapply(dat,as.character),na.rm=TRUE))
#[1] "Asian" "Black" "White"

Wenn Sie an einer bestimmten Untergruppe arbeiten müssen, können Sie Folgendes tun:

do.call(pmax,c(lapply(dat[c("Var1","Var2")],as.character),na.rm=TRUE))

Eine Alternative, die nicht benötigt wird as.character wäre:

dat[cbind(1:nrow(dat),max.col(!is.na(dat)))]
#[1] "Asian" "Black" "White"

4
2018-01-12 01:35



Was ist mit dieser Lösung?

ind <- apply(df, 1, function(x) which(!is.na(x)))
df[cbind(seq_along(ind), ind)]
[1] "Asian" "Black" "White"

2
2018-01-12 01:30



Eine andere Lösung (ziemlich seltsam, stimme ich zu und ziemlich kurz, Ihre Spalten müssen Zeichen sein, wie es in Ihrem Beispiel zu sein scheint):

> library(tidyr)
> unite(replace(df, is.na(df), ""), V, c(Var1, Var2), sep=''))$V
#[1] "Asian" "Black" "White"

Oder es kann riskant sein, gsub zu verwenden, aber hier ist NA ein Teil einer Zeichenkette, die so sicher ist:

> gsub("NA", "", unite(df, V, c(Var1, Var2), sep='')$V)
#[1] "Asian" "Black" "White"

1
2018-01-12 21:57