2015-10-01

Combinar columnas de factores o caracteres en una columna con R

Title

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
    
  • Función ifelse
  • 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

Nube de datos