33 votos

¿Cómo cambiar los datos entre los formatos ancho y largo en R?

Puede tener datos en formato ancho o en formato largo. Esto es bastante importante, ya que los métodos utilizables son diferentes, dependiendo del formato. Sé que tienes que trabajar con melt() y cast() del paquete reshape, pero parece que hay algunas cosas que no entiendo.

¿Puede alguien explicarme brevemente cómo se hace esto?

0 votos

Por favor, facilite el ejemplo de lo que quiere conseguir. ¿Qué es exactamente lo que no consigue?

3 votos

Aquí está la entrada de mi blog con ejemplo de uso melt y cast . La conversión del formato ancho al largo se realiza en una sola etapa. Realmente no hay nada más especial.

0 votos

Bienvenido a las estadísticas. Quizá te ayude incluir en tu pregunta un pequeño conjunto de datos reproducibles para explicar lo que quieres. Lea sigmafield.org/2011/01/18/… para más.

29voto

David J. Sokol Puntos 1730

Hay varios recursos en la página web de Hadley Wickham sitio web para el paquete (ahora llamado reshape2 ), incluyendo un enlace a un papel sobre el paquete en el Journal of Statistical Software.

He aquí un breve ejemplo del documento:

> require(reshape2)
Loading required package: reshape2
> data(smiths)
> smiths
     subject time age weight height
1 John Smith    1  33     90   1.87
2 Mary Smith    1  NA     NA   1.54

Observamos que los datos están en la forma amplia. Para pasar a la forma larga, hacemos el smiths marco de datos fundido :

> melt(smiths)
Using subject as id variables
     subject variable value
1 John Smith     time  1.00
2 Mary Smith     time  1.00
3 John Smith      age 33.00
4 Mary Smith      age    NA
5 John Smith   weight 90.00
6 Mary Smith   weight    NA
7 John Smith   height  1.87
8 Mary Smith   height  1.54

Observe cómo melt() eligió una de las variables como id, pero podemos indicar explícitamente cuál utilizar mediante el argumento 'id' :

> melt(smiths, id = "subject")
     subject variable value
1 John Smith     time  1.00
2 Mary Smith     time  1.00
3 John Smith      age 33.00
4 Mary Smith      age    NA
5 John Smith   weight 90.00
6 Mary Smith   weight    NA
7 John Smith   height  1.87
8 Mary Smith   height  1.54

Este es otro ejemplo de ?cast :

#Air quality example
names(airquality) <- tolower(names(airquality))
aqm <- melt(airquality, id=c("month", "day"), na.rm=TRUE)

Si almacenamos el marco de datos fundido, podemos fundición en otras formas. En la nueva versión de reshape (llamado reshape2 ) hay funciones acast() y dcast() devolviendo un resultado tipo array (matriz, vector) o un marco de datos respectivamente. Estas funciones también toman una función de agregación (por ejemplo mean() ) para proporcionar resúmenes de datos en forma fundida. Por ejemplo, siguiendo con el ejemplo de la calidad del aire anterior, podemos generar, en forma amplia, los valores medios mensuales de las variables del conjunto de datos:

> dcast(aqm, month ~ variable, mean)
  month    ozone  solar.r      wind     temp
1     5 23.61538 181.2963 11.622581 65.54839
2     6 29.44444 190.1667 10.266667 79.10000
3     7 59.11538 216.4839  8.941935 83.90323
4     8 59.96154 171.8571  8.793548 83.96774
5     9 31.44828 167.4333 10.180000 76.90000

En realidad sólo hay dos funciones principales en reshape2 : melt() y el acast() y dcast() emparejamiento. Mira los ejemplos en las páginas de ayuda de estas dos funciones, consulta el sitio web de Hadley (enlace anterior) y mira el documento que he mencionado. Eso debería servirte para empezar.

También puede buscar en Hadley's plyr paquete que hace cosas similares a reshape2 pero está diseñado para hacer mucho más.

0 votos

dcast(aqm, month ~ variable) ¿Qué haría esto sin la función de agregación?

0 votos

@CravingSpirit devolvería el número de observaciones de cada variable. Leer ?dcast que le habría dicho esto (ver los detalles para el argumento fun.aggregate ).

8voto

Eric Davis Puntos 1542
  • Quick-R tiene un sencillo ejemplo de uso del paquete reshape

  • Ver también ?reshape ( LINK ) para el modo Base R de pasar del formato ancho al largo.

8voto

No tienes que usar melt y cast .

La remodelación de los datos puede hacerse de muchas maneras. En su ejemplo particular sobre su cita utilizando recast con aggregate era redundante porque aggregate hace la tarea bien por sí mismo.

aggregate(cbind(LPMVTUZ, LPMVTVC, LPMVTXC) ~ year, dtm, sum)
# or even briefer by first removing the columns you don't want to use
aggregate(. ~ year, dtm[,-2], sum)

Me gusta cómo, en la entrada de tu blog, explicas lo que melt está haciendo. Muy poca gente lo entiende y una vez que lo ves, es más fácil ver cómo cast funciona y cómo podrías escribir tus propias funciones si lo deseas.

2voto

Ηλίας Puntos 109

Ver el wiki de reshape2 . Seguramente proporciona más ejemplos, como era de esperar.

2voto

tykho Puntos 26

Sólo notar que no hay referencia a los métodos de remodelación más eficientes y extensos en data.table aquí, así que voy a publicar sin más comentarios la excelente respuesta de Zach/Arun en StackOverflow para una pregunta similar:

https://stackoverflow.com/questions/6902087/proper-fastest-way-to-reshape-a-data-table/6913151#6913151

Y, en particular, la maravillosa viñeta sobre el data.table Página de GitHub:

https://github.com/Rdatatable/data.table/wiki/Getting-started

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X