¿Cómo cambiar datos entre formatos anchos y largos en R? [cerrado]


32

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 tiene que trabajar con melt()y cast()desde el paquete de remodelación, pero parece que hay algunas cosas que no entiendo.

¿Alguien me puede dar una breve descripción de cómo hacer esto?


Proporcione el ejemplo de lo que desea lograr. ¿Qué es exactamente lo que no entiendes?
mpiktas

3
Aquí está mi publicación de blog con ejemplos de uso melty cast. Allí la conversión de formato ancho a largo se realiza en una etapa. Realmente no hay nada más especial.
mpiktas

Bienvenido a las estadísticas. Puede que le resulte útil incluir un conjunto de datos pequeño y reproducible en su pregunta para explicar lo que desea. Lea sigmafield.org/2011/01/18/… para más información.
PaulHurleyuk

Vea esta pregunta SO para conocer muchas formas de hacerlo.
Axeman

Respuestas:


26

Hay varios recursos en el sitio web de Hadley Wickham para el paquete (ahora llamado reshape2), incluido un enlace a un documento sobre el paquete en el Journal of Statistical Software.

Aquí hay un breve ejemplo del artículo:

> 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 forma amplia. Para ir a la forma larga, hacemos que el smithsmarco de datos esté 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 establecer explícitamente cuál usar mediante un 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

Aquí hay 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 convertirlo en otras formas. En la nueva versión de reshape(llamado reshape2) hay funciones acast()y dcast()devuelve un resultado tipo matriz (matriz, matriz, vector) o un marco de datos respectivamente. Estas funciones también tienen una función de agregación (por ejemplo mean()) para proporcionar resúmenes de datos en forma fundida. Por ejemplo, siguiendo el ejemplo anterior de Calidad del aire, podemos generar, en forma amplia, valores medios mensuales para las variables en el 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, hay sólo dos funciones principales en reshape2: melt()y el acast()y dcast()el emparejamiento. Mire los ejemplos en las páginas de ayuda para estas dos funciones, vea el sitio web de Hadley (enlace arriba) y mire el documento que mencioné. Eso debería ayudarte a comenzar.

También puede consultar el plyrpaquete de Hadley que hace cosas similares reshape2pero está diseñado para hacer mucho más.


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

@CravingSpirit devolvería el número de observaciones para cada variable. Lea lo ?dcastque le habría dicho esto (vea los detalles para el argumento fun.aggregate).
Restablece a Monica - G. Simpson

8
  • Quick-R tiene un ejemplo simple de uso del paquete de remodelación

  • Consulte también ?reshape( ENLACE ) para ver la forma Base R de moverse entre formato ancho y largo.


7

No tienes que usar melty cast.

La remodelación de datos se puede hacer de muchas maneras. En su ejemplo particular en su cita, usar recastcon aggregateera redundante porque aggregatela tarea funciona bien por sí misma.

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 tu publicación de blog, explicas lo que meltestá haciendo. Muy pocas personas entienden eso y una vez que lo ve, se vuelve más fácil ver cómo castfunciona y cómo puede escribir sus propias funciones si lo desea.



2

Simplemente notando que no hay referencia a los métodos de remodelación más eficientes y extensos data.tableaquí, así que publico 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 está la maravillosa viñeta en la data.tablepágina de GitHub:

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.