Cómo cambiar la forma de los datos de formato largo a ancho
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 melt
y cast
algunas otras cosas, pero ninguna parece hacer el trabajo.
Usando reshape
la función:
reshape(dat1, idvar = "name", timevar = "numbers", direction = "wide")
El nuevo tidyr
paquete (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ó spread
y gather
en una ruta de desuso, prefiriendo en su lugar pivot_wider
y 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 ,
tidyr
es un replanteamientoreshape2
diseñado para acompañar el marco de datos ordenado y para trabajar mano a manomagrittr
ydplyr
construir un canal sólido para el análisis de datos.Así como
reshape2
menos que remodelar,tidyr
menos quereshape2
. Está diseñado específicamente para ordenar datos, no la remodelación general quereshape2
lo hace, ni la agregación general que hizo la remodelación. En particular, los métodos integrados solo funcionan para marcos de datos ytidyr
no proporcionan márgenes ni agregación.
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)