2014-07-09

Múltiples valores y funciones de agregación con reshape2 y plyr

Title Anteriormente tratamos de la agregación de datos con reshape2. En esta ocasión examinaremos dos aspectos: la creación de múltiples variables de medida y de varias funciones de agregación al agrupar los datos.

Puedes descargar el fichero Análisis de ventas2.csv y copiarlo en tu directorio de trabajo. He añadido la columna margen que utilizaremos junto con las ventas y eliminado los separadores de miles de las ventas.

Múltiples variables de medida

1. Importamos nuestros datos

require(plyr)  # Para usar la función . de plyr
require(reshape2)
data <- read.csv("Análisis de ventas2.csv", sep = ";") # O bien
data <- read.csv2("Análisis de ventas2.csv")
2. Formateamos los datos importados.

names(data) <- tolower(names(data))  # Nombres de columnas en minúsculas
data$ventas <- sub(",", ".", data$ventas)  # Separador decimal el punto
data$ventas <- as.numeric(data$ventas)  # Ventas tipo de variable numérica
data$margen <- sub(",", ".", data$margen)  # Separador decimal el punto
data$margen <- as.numeric(data$margen)  # Margen tipo de variable numérica
data$fecha.de.pedido <- as.Date(data$fecha.de.pedido, "%d/%m/%Y") # Fechas
3. Definimos identifiers (id.vars) y measured variables (measure.vars) con melt. Identificadores o nombres de columna y variables de medida o valores. Para añadir más variables, las especificamos en el argumento measure.vars.

# Por posición, nº de columna.
data.m <- melt(data, id.vars = c(1:20), measure.vars = c(6, 20))
# Por nombre
data.m <- melt(data, id.vars = c(1:20), measure.vars = c("ventas", "margen")) 
A la derecha de la última id.vars (mesdetrimestre en este caso) crea dos columnas, con los nombres variable y value. Bajo variable incluirá aquellas definidas como measure.vars: las ventas y el margen. Bajo value, su valor correspondiente.
4. Comenzamos a agregar datos usando dcast.

# Por empleado ventas y margen. Función de agregación: sum.
data.c <- dcast(data.m, empleado ~ variable, sum, margins = "empleado")
data.c # Resultado:
               empleado   ventas   margen
1      Francisco Chaves 19974.25 12614.81
2      Humberto Acevedo  3786.50  3041.46
3         Jesús Escolar  2617.50  1629.45
4     Juan Carlos Rivas  6378.00  3862.80
5          Luis Bonifaz   680.00   571.20
6        María González  6561.00  4548.92
7    María Jesús Cuesta  6278.00  4518.62
8 Pilar Pinilla Gallego  5787.50  3919.55
9                 (all) 52062.75 34706.81
Más ejemplos:

Para cada agrupación dcast devolverá una columna por cada una de las variables (measure.vars) creadas, como en la tabla anterior. Para que sume ambas variables usamos "~ ." en lugar de "~ variable". A modo ilustrativo sumamos ventas y margen.

# Por empleado suma de ventas y margen
data.c <- dcast(data.m, empleado ~ ., sum, margins = "empleado")
              empleado        .
1      Francisco Chaves 32589.06
2      Humberto Acevedo  6827.96
3         Jesús Escolar  4246.95
4     Juan Carlos Rivas 10240.80
5          Luis Bonifaz  1251.20
6        María González 11109.92
7    María Jesús Cuesta 10796.62
8 Pilar Pinilla Gallego  9707.05
9                 (all) 86769.56
# Total de ventas y margen separados
data.c <- dcast(data.m, . ~ variable, sum) 
  .   ventas   margen
1 . 52062.75 34706.81
# Total de ventas y margen sumados
data.c <- dcast(data.m, . ~ ., sum) 
  .        .
1 . 86769.56
Otras funciones de agregación, usando el ejemplo anterior:

# Media
data.c <- dcast(data.m, empleado ~ variable, mean, margins = "empleado")
# Contar número de ocurrencias
data.c <- dcast(data.m, empleado ~ variable, length, margins = "empleado")
Mínimo y máximo generan un error. Es necesario usar la función suppressWarnings.

Warning message:
In .fun(.value[0], ...) : no non-missing arguments to min; returning Inf
# Mínimo
data.c <- suppressWarnings(dcast(data.m, empleado ~ variable, min, margins = "nombre.del.cliente"))
# Máximo
data.c <- suppressWarnings(dcast(data.m, empleado ~ variable, max, margins = "nombre.del.cliente"))

Múltiples funciones de agregación

Ahora explicamos cómo usar varias funciones de agregación al mismo tiempo. En la entrada y apartados anteriores usábamos solamente una función en cada agregación.

1. Seguimos los pasos 1, 2 y 3 del punto anterior.

2. Empleamos la función ddply del paquete plyr para presentar varias funciones de agregación en la misma tabla. En nuestro ejemplo, mínimo, media, máximo y desviación típica.

resumen <- ddply(data.m, .(mes, empleado), summarise, min = min(value),
                                                     mean = mean(value),
                                                      max = max(value),
                                                       sd = sd(value))
head(resumen)
  mes              empleado     min      mean  max        sd
1   1      Francisco Chaves   68.25  620.8125 1400 648.62686
2   1     Juan Carlos Rivas  231.84  253.9200  276  31.22584
3   1    María Jesús Cuesta  175.50  490.8750  920 338.56126
4   1 Pilar Pinilla Gallego   29.40  254.2000  530 199.75753
5   2      Francisco Chaves  139.84  161.9200  184  31.22584
6   2    María Jesús Cuesta 1621.20 1775.6000 1930 218.35457
Los resultados consideran conjuntamente ventas y margen, se agrupan como si fueran una única variable. Para separar nuestras variables, en el argumento variables de la función ddply, especificamos mes, empleado y variable:

resumen <- ddply(data.m, .(mes, empleado, variable), summarise,
                                              min = min(value),
                                            mean = mean(value),
                                              max = max(value),
                                                 sd = sd(value))
head(resumen)
  mes           empleado variable    min    mean     max       sd
1   1   Francisco Chaves   ventas 105.00 752.500 1400.00 915.7033
2   1   Francisco Chaves   margen  68.25 489.125  910.00 595.2071
3   1  Juan Carlos Rivas   ventas 276.00 276.000  276.00       NA
4   1  Juan Carlos Rivas   margen 231.84 231.840  231.84       NA
5   1 María Jesús Cuesta   ventas 270.00 595.000  920.00 459.6194
6   1 María Jesús Cuesta   margen 175.50 386.750  598.00 298.7526
Se puede observar como separa correctamente por fila los resultados por ventas y margen.

ddply frente a dcast

Compara la concisión con ddply frente a dcast. Además, ddply resume los datos en un único data.frame.

resumen <- ddply(data.m, .(empleado, variable), summarise,
                                              min = min(value),
                                            mean = mean(value),
                                              max = max(value),
                                                sd = sd(value),
                                        length = length(value))
data.min <- suppressWarnings(dcast(data.m, empleado ~ variable, min, margins = "empleado"))
data.mean <- dcast(data.m, empleado ~ variable, mean, margins = "empleado")
data.max <- suppressWarnings(dcast(data.m, empleado ~ variable, max, margins = "empleado"))
data.sd <- dcast(data.m, empleado ~ variable, sd, margins = "empleado")
data.length <- dcast(data.m, empleado ~ variable, length, margins = "empleado")
Referencias:
Stackoverflow

Entradas relacionadas:
Agregar datos en R con el paquete reshape2

No hay comentarios:

Publicar un comentario

Nube de datos