On Wed, Apr 25, 2012 at 02:22:05PM +0200, Patrick Hausmann wrote: > Hello, > > I am trying to get a new vector 'x1' based on the not NA-values in > column 'a' and 'b'. I found a way but I am sure this is not the best > solution. So any ideas on how to "optimize" this would be great! > > m <- factor(c("a1", "a1", "a2", "b1", "b2", "b3", "d1", "d1"), ordered > = TRUE) > df <- data.frame( a= m, b = m) > df[1,1] <- NA > df[4,2] <- NA > df[2,2] <- NA > df[6,1] <- NA > df > > w <- !apply(df, 2, is.na) > v <- apply(w, 1, FUN=function(L) which(L == TRUE)[[1]]) > > for (i in 1:nrow(df) ) { > g[i] <- df[i, v[i]] > } > > df$x1 <- g
Hello. The above code does not initialize g. Adding the command g <- rep(NA, times=nrow(df)) i get the same as using df$x1 <- ifelse(is.na(df$a), df$b, df$a) df a b x1 1 <NA> a1 1 2 a1 <NA> 1 3 a2 a2 2 4 b1 <NA> 3 5 b2 b2 4 6 <NA> b3 5 7 d1 d1 6 8 d1 d1 6 The codes are obtained, since the original data frame contains factors. If the intention is to keep character values, then use df$x1 <- ifelse(is.na(df$a), as.character(df$b), as.character(df$a)) df a b x1 1 <NA> a1 a1 2 a1 <NA> a1 3 a2 a2 a2 4 b1 <NA> b1 5 b2 b2 b2 6 <NA> b3 b3 7 d1 d1 d1 8 d1 d1 d1 Hope this helps. Petr Savicky. ______________________________________________ R-help@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.