Problema
Partimos del siguiente data frame y deseamos fusionar las dos columnas en una nueva, de manera que no hay ningún valor NA.
Datos
var1 var2
1 red <NA>
2 <NA> lightred
3 <NA> blue
4 <NA> lightred
5 red <NA>
6 orange <NA>
help <- data.frame(var1 = c("red", NA, NA, NA, "red", "orange"),
var2 = c(NA, "lightred", "blue", "lightred", NA, NA))
Soluciones
- Función coalesce
Con el paquete sqldf tenemos acceso a la función coalesce de SQL. Coalesce devuelve la primera columna no nula en la lista. Si todas las columnas evaluadas son nulas devolverá el valor nulo.
library(sqldf)
# Nueva columna newvar
help$newvar <- sqldf("select coalesce(var1, var2) newvar from help")
# O todo el data frame
help <- sqldf("select *, coalesce(var1, var2) newvar from help")
var1 var2 newvar
1 red <NA> red
2 <NA> lightred lightred
3 <NA> blue blue
4 <NA> lightred lightred
5 red <NA> red
6 orange <NA> orange
Como var1 y var 2 son factores necesitamos convertirlos en caracteres con as.character. El inconveniente de esta segunda opción es que si hubiera más de dos columnas necesitaríamos anidar más ifelse mientras que coalesce podríamos seguir añadiendo columnas como nuevos argumentos.
within(help, newvar <- ifelse(is.na(var1), as.character(var2), as.character(var1)))
var1 var2 newvar
1 red <NA> red
2 <NA> lightred lightred
3 <NA> blue blue
4 <NA> lightred lightred
5 red <NA> red
6 orange <NA> orange
Entradas relacionadas
Referencias
No hay comentarios:
Publicar un comentario