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