Cómo cambiar la forma de los datos de formato largo a ancho

Resuelto Steve asked hace 54 años • 14 respuestas

Tengo problemas para reorganizar el siguiente marco de datos:

set.seed(45)
dat1 <- data.frame(
    name = rep(c("firstName", "secondName"), each=4),
    numbers = rep(1:4, 2),
    value = rnorm(8)
    )

dat1
       name  numbers      value
1  firstName       1  0.3407997
2  firstName       2 -0.7033403
3  firstName       3 -0.3795377
4  firstName       4 -0.7460474
5 secondName       1 -0.8981073
6 secondName       2 -0.3347941
7 secondName       3 -0.5013782
8 secondName       4 -0.1745357

Quiero remodelarlo para que cada variable de "nombre" única sea un nombre de fila, con los "valores" como observaciones a lo largo de esa fila y los "números" como nombres de columna. Algo así como esto:

     name          1          2          3         4
1  firstName  0.3407997 -0.7033403 -0.3795377 -0.7460474
5 secondName -0.8981073 -0.3347941 -0.5013782 -0.1745357

He mirado melty castalgunas otras cosas, pero ninguna parece hacer el trabajo.

Steve avatar Jan 01 '70 08:01 Steve
Aceptado

Usando reshapela función:

reshape(dat1, idvar = "name", timevar = "numbers", direction = "wide")
Chase avatar May 04 '2011 23:05 Chase

El nuevo tidyrpaquete (en 2014) también hace esto de manera simple, siendo gather()/ spread()los términos para melt/ cast.

Editar: ahora, en 2019, tidyr v 1.0 se lanzó y configuró spready gatheren una ruta de desuso, prefiriendo en su lugar pivot_widery pivot_longer, que puede encontrar descrito en esta respuesta . Continúe leyendo si desea echar un vistazo breve a la breve vida de spread/gather.

library(tidyr)
spread(dat1, key = numbers, value = value)

Desde github ,

tidyres un replanteamiento reshape2diseñado para acompañar el marco de datos ordenado y para trabajar mano a mano magrittry dplyrconstruir un canal sólido para el análisis de datos.

Así como reshape2menos que remodelar, tidyrmenos que reshape2. Está diseñado específicamente para ordenar datos, no la remodelación general que reshape2lo hace, ni la agregación general que hizo la remodelación. En particular, los métodos integrados solo funcionan para marcos de datos y tidyrno proporcionan márgenes ni agregación.

Gregor Thomas avatar Jul 29 '2014 19:07 Gregor Thomas

Puede hacer esto con la reshape()función o con las funciones melt()/ cast()en el paquete de remodelación. Para la segunda opción, el código de ejemplo es

library(reshape)
cast(dat1, name ~ numbers)

O usandoreshape2

library(reshape2)
dcast(dat1, name ~ numbers)
Ista avatar May 04 '2011 22:05 Ista