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
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
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
- Convertir de formato largo a ancho con la función unstack en R
- Convertir de formato largo a ancho usando una función de agregación en R
- Tablas de contingencia en R
- Transformar tabla de contingencia en tabla de de frecuencias
Referencias
No hay comentarios:
Publicar un comentario