2017-05-26

Convertir de formato largo a ancho con sqldf en R

Problema

Deseamos transformar un data frame de formato largo a ancho. Partimos del siguiente data frame:

        name numbers      value
1  firstName       1 -0.3016990
2  firstName       2  0.4782982
3  firstName       3 -0.3274221
4  firstName       4  0.8950889
5 secondName       1 -1.3476795
6 secondName       2 -0.4671124
7 secondName       3 -1.0883609
8 secondName       4  1.8702156

Y queremos llegar a este otro. Con name como nombres de filas, cuatro columnas basadas en numbers y como valores, values.

                  X1         X2         X3        X4
firstName  -0.301699  0.4782982 -0.3274221 0.8950889
secondName -1.347680 -0.4671124 -1.0883609 1.8702156

  • Datos originales
  • dat1 <- structure(list(name = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 
    2L), .Label = c("firstName", "secondName"), class = "factor"), 
        numbers = c(1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L), value = c(-0.301698990300544, 
        0.47829821507312, -0.327422119821659, 0.895088877410118, 
        -1.3476795169412, -0.467112422933039, -1.08836089961649, 
        1.87021564288651)), .Names = c("name", "numbers", "value"
    ), row.names = c(NA, -8L), class = "data.frame")
    

    Solución

  • Paquete sqldf
  • Empleamos la sintaxis de SQL de sqldf para transformar o pivotar de formato largo a ancho. Empleamos MAX(CASE WHEN.

    library(sqldf)
    sqldf('SELECT name,
          MAX(CASE WHEN numbers = 1 THEN value ELSE NULL END) x1, 
          MAX(CASE WHEN numbers = 2 THEN value ELSE NULL END) x2,
          MAX(CASE WHEN numbers = 3 THEN value ELSE NULL END) x3,
          MAX(CASE WHEN numbers = 4 THEN value ELSE NULL END) x4
          FROM dat1
          GROUP BY name')
    
                      X1         X2         X3        X4
    firstName  -0.301699  0.4782982 -0.3274221 0.8950889
    secondName -1.347680 -0.4671124 -1.0883609 1.8702156
    

    Entradas relacionadas

    Referencias

    No hay comentarios:

    Publicar un comentario

    Nube de datos