I have a data frame with two columns "a" and "b" with alternating missing values (NA
)
a b
dog <NA>
mouse <NA>
<NA> cat
bird <NA>
I want to "merge" / combine them to a new column c that looks like this, i.e. the non-NA
element in each row is selected:
c
dog
mouse
cat
bird
I tried merge
and join
, but neither worked as I wanted. Maybe because I do not have an id with which to merge? For integers I would just circumvent this and add both columns, but how in my case?
I wrote a coalesce() function for this type of task which works much like the SQL coalesce function. You would use it like
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
Another option is to use which
with 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
Or
df$c <- df[cbind(1:nrow(df),max.col(!is.na(df)))]
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With