R: replace NA with item from vector

ifelse is your friend.

Using Dirk's dataset

df <- within(df, X <- ifelse(is.na(X), Y, X))

Just vectorise it -- the boolean index test is one expression, and you can use that in the assignment too.

Setting up the data:

R> df <- data.frame(X=c("x", "x", NA, "x"), Y=rep("y",4), stringsAsFactors=FALSE)
R> df
     X Y
1    x y
2    x y
3 <NA> y
4    x y

And then proceed by computing an index of where to replace, and replace:

R> ind <- which( is.na( df$X ) )
R> df[ind, "X"] <- df[ind, "Y"]

which yields the desired outcome:

R> df
  X Y
1 x y
2 x y
3 y y
4 x y
R>