La función Aggregate (similar a group by en SQL) en R, divide los datos en subconjuntos, calcula estadísticas de resumen para cada subconjunto y devuelve el resultado en un grupo por formulario.
aggregate(campo_dataframe, lista, funcion)
# campo_dataframe: Campo del dataframe, al cual se le aplicará una función.
# lista: Lista de campos a agrupar.
# funcion: Estadísticas de resumen que se pueden aplicar a todos los subconjuntos de datos. (sum|length|mean...)
df = data.frame("PAIS" = c("Chile","Argentina","Perú","Chile","Chile"),
"CUIDAD" = c("Santiago","Córdoba","Lima","Santiago","Concepción"),
"VENTAS" = c(100,100,100,100,100))
df
## PAIS CUIDAD VENTAS
## 1 Chile Santiago 100
## 2 Argentina Córdoba 100
## 3 Perú Lima 100
## 4 Chile Santiago 100
## 5 Chile Concepción 100
PASO 01: Debemos chequear los tipos de datos del df.
En este caso sólo necesitamos que la variable VENTAS sea numérico.
str(df)
## 'data.frame': 5 obs. of 3 variables:
## $ PAIS : Factor w/ 3 levels "Argentina","Chile",..: 2 1 3 2 2
## $ CUIDAD: Factor w/ 4 levels "Concepción","Córdoba",..: 4 2 3 4 1
## $ VENTAS: num 100 100 100 100 100
Extra: Supongamos que todos los campos son Character.
#A cada columna del df la transformamos en Character
df <- data.frame(lapply(df, as.character), stringsAsFactors=FALSE)
str(df)
## 'data.frame': 5 obs. of 3 variables:
## $ PAIS : chr "Chile" "Argentina" "Perú" "Chile" ...
## $ CUIDAD: chr "Santiago" "Córdoba" "Lima" "Santiago" ...
## $ VENTAS: chr "100" "100" "100" "100" ...
PASO 02: Transformar a numérico el campo VENTAS.
df$VENTAS <- as.numeric(df$VENTAS)
str(df)
## 'data.frame': 5 obs. of 3 variables:
## $ PAIS : chr "Chile" "Argentina" "Perú" "Chile" ...
## $ CUIDAD: chr "Santiago" "Córdoba" "Lima" "Santiago" ...
## $ VENTAS: num 100 100 100 100 100
PASO 03: Ejecutamos la función aggregate.
#aplicamos la función
salida = aggregate(df[,c("VENTAS")],by = list(PAISES = df$PAIS), FUN = sum)
#cambia el nombre
names (salida)[2] = "SUMA_VENTAS"
#mostramos la salida
salida
## PAISES SUMA_VENTAS
## 1 Argentina 100
## 2 Chile 300
## 3 Perú 100
Extra: Supongamos que deseamos agrupar por PAIS y CUIDAD:
#aplicamos la función
salida = aggregate(df[,c("VENTAS")],by = list(PAISES = df$PAIS,CUIDADES = df$CUIDAD),FUN = sum)
#Cambiamos el nombre de la suma
names (salida)[3] = "SUMA_VENTAS"
#mostramos la salida
salida
## PAISES CUIDADES SUMA_VENTAS
## 1 Chile Concepción 100
## 2 Argentina Córdoba 100
## 3 Perú Lima 100
## 4 Chile Santiago 200