Datos en formato largo y melt

En ocasiones uno recibe datos no muy distintos de

aragon <- read.table("http://datanalytics.com/uploads/pob_aragon", 
                     header = T, sep = "\t")
aragon
 
# Provincias Periodo Hombres Mujeres
# 1     Huesca    2014  113840  111069
# 2     Huesca    2004  107961  104940
# 3     Teruel    2014   71449   68916
# 4     Teruel    2004   71073   68260
# 5   Zaragoza    2014  471675  488436
# 6   Zaragoza    2004  441840  455510

Los mismos datos en formato largo son:

library(reshape2)
 
aragon.largo <- melt(aragon, id.vars = c("Provincias", "Periodo"))
aragon.largo
# Provincias Periodo variable  value
# 1      Huesca    2014  Hombres 113840
# 2      Huesca    2004  Hombres 107961
# 3      Teruel    2014  Hombres  71449
# 4      Teruel    2004  Hombres  71073
# 5    Zaragoza    2014  Hombres 471675
# 6    Zaragoza    2004  Hombres 441840
# 7      Huesca    2014  Mujeres 111069
# 8      Huesca    2004  Mujeres 104940
# 9      Teruel    2014  Mujeres  68916
# 10     Teruel    2004  Mujeres  68260
# 11   Zaragoza    2014  Mujeres 488436
# 12   Zaragoza    2004  Mujeres 455510

Si eso de datos largos (o en formato largo) no te suena, pierde un momento en:

  • Convencerte de que, efectivamente, la información contenida en ambas tablas es idéntica
  • Memorizar lo siguiente: reshape2, reshape2,… y melt, melt,…
  • Entender el papel del argumento id.vars en la llamada a melt: ¿qué catástrofe sucede si usas id.vars = "Provincia"?

¿Por qué datos en formato largo? Creo que por cuatro motivos. El primero, subjetivo y tal vez el menos importante, es conceptual: creo que es una representación natural de los datos. Una tabla se convierte en un vector de valores etiquetados. En el ejemplo anterior, la columna value contiene números y las anteriores los contextualizan, los describen.

El segundo es que es el formato más conveniente para filtrar. Cualquier filtro en formato largo se escribe tal que aragon[`condición`,] (o similares). No hay selección de columnas.

Tercero, que es el formato más conveniente para realizar cierto tipo de agregaciones (p.e., eliminando dimensiones para extraer totales). Verbigracia,

library(plyr)
 
aragon.totales <- ddply(aragon.largo, .(Provincias, Periodo), 
                        summarize, total = sum(value))
 
aragon.totales
Provincias Periodo  total
# 1     Huesca    2004 212901
# 2     Huesca    2014 224909
# 3     Teruel    2004 139333
# 4     Teruel    2014 140365
# 5   Zaragoza    2004 897350
# 6   Zaragoza    2014 960111

Y finalmente, es que a partir del formato largo se puede reestructurar la información de la tabla de otras maneras fácilmente. Aunque de eso hablaré en otra entrada.

6 comentarios sobre “Datos en formato largo y melt

  1. David 13 marzo, 2015 8:45

    También para la librería googleVis que además de vistosa es interactiva. Gracias por el código.

  2. Isidro Hidalgo 13 marzo, 2015 15:43

    Normalmente se usa el formato largo, mucho más útil en general… ¡pero el ancho es muy útil para hacer clusters! Así que no queda más remedio que usar los dos… XD

  3. Inés Garmendia 6 abril, 2015 13:09

    Muy buena reflexión. Añado que el truco para ver si el formato de la tabla es adecuado es ver si se ajusta a la definición de «tidy data»:

    – variables en columnas
    – observaciones en filas
    – en una única tabla

    Se ve que los valores posibles de la variable «sexo» (hombres y mujeres), inicialmente se nos estaban colando como «variables». En el formato largo (tidy data set), ya están como observaciones.

  4. Carlos J. Gil Bellosta 6 abril, 2015 20:27

    Te refieres al artículo de Wickham, ¿verdad? No sabes cuán (por otros motivos, además) es tu comentario.

Los comentarios están desabilitados.