2015-01-08 8 views
7

fehlt habe ich einen Datenrahmen mit zwei Spalten „a“ und „b“ mit fehlenden Werten alternierenden (NA)Coalesce zwei String-Spalten mit abwechselnd Werten einen

a  b 
dog <NA> 
mouse <NA> 
<NA> cat 
bird <NA> 

ich will „merge“/kombinieren sie auf eine neue Spalte c, die in jeder Zeile wie diese, dh die nicht NA Element sieht ausgewählt:

c 
dog 
mouse 
cat 
bird 

ich versuchte merge und join, aber weder gearbeitet, wie ich wollte. Vielleicht, weil ich keine ID habe, mit der ich verschmelzen könnte? Für ganze Zahlen würde ich das einfach umgehen und beide Spalten hinzufügen, aber wie in meinem Fall?

+0

Sind die echten 'NA' Werte oder Fälschung? –

Antwort

8

Sie können versuchen, pmax

df$c <- pmax(df$a, df$b) 
df 
#  a b  c 
# 1 dog <NA> dog 
# 2 mouse <NA> mouse 
# 3 <NA> cat cat 
# 4 bird <NA> bird 

... oder ifelse:

df$c <- ifelse(is.na(df$a), df$b, df$a)

Weitere allgemeine Lösungen in Fällen mit mehr als zwei Spalten, finden Sie verschiedene Möglichkeiten, coalesce in R here zu implementieren.

+0

die beste Lösung für mich war die zweite Option mit 'ifelse'. Vielen Dank –

4

Ich schrieb eine coalesce() Funktion für diese Art von Aufgabe, die ähnlich wie die SQL-Coalesce-Funktion funktioniert. Sie würden es wie

dd<-read.table(text="a  b 
dog NA 
mouse NA 
NA cat 
bird NA", header=T) 

dd$c <- with(dd, coalesce(a,b)) 
dd 
#  a b  c 
# 1 dog <NA> dog 
# 2 mouse <NA> mouse 
# 3 <NA> cat cat 
# 4 bird <NA> bird 
3

verwenden Hier ist mein Versuch (geändert durch @MrFlick)

df$c <- apply(df, 1, function(x) na.omit(x)[1]) 
df 
#  a b  c 
# 1 dog <NA> dog 
# 2 mouse <NA> mouse 
# 3 <NA> cat cat 
# 4 bird <NA> bird 
+1

Würde nicht "gelten (df, 1, Funktion (x) na.omit (x) [1])" funktionieren genauso gut, und ein bisschen einfacher? – MrFlick

+0

Ja, schön fangen ... –

+1

Ich würde auch 'df [which (! Is.na (df), arr.ind = TRUE)] – akrun

1

Sie ein einfaches apply verwenden:

df$c <- apply(df,1,function(x) x[!is.na(x)] ) 

> df 
     a b  c 
1 dog <NA> dog 
2 mouse <NA> mouse 
3 <NA> cat cat 
4 bird <NA> bird 
2

Eine weitere Möglichkeit ist die Verwendung which mit arr.ind=TRUE

indx <- which(!is.na(df), arr.ind=TRUE) 
df$c <- df[indx][order(indx[,1])] 
df 
# a b  c 
#1 dog <NA> dog 
#2 mouse <NA> mouse 
#3 <NA> cat cat 
#4 bird <NA> bird 

Oder

df$c <- df[cbind(1:nrow(df),max.col(!is.na(df)))]