6.9 Resúmenes estadísticos
Realizar resúmenes estadísticos es uno de los grandes motivos de aprender a trabajar con pipelines. Puede aplicarse promedio mean()
, mediana median()
, desviación estándar sd()
, varianza var()
, suma sum()
, mínimo min()
, máximo max()
, además de cualquier función existente o creada siempre y cuando el resultado de dichas funciones sea un único valor (es decir, un vector de un elemento).
El resultado final de cualquier función de la familia de summarise()
es una tabla conteniendo las columnas que se solicitaron como resumen estadístico. La estructura base es:
%>% ... %>%
BASE_DE_DATOS summarise(COLUMNA_NUEVA = FUNCION_ESTADÍSTICA(COLUMNA_ANTIGUA))
mean()
, median()
y las demás mencionadas arriba, tienen problemas lidiando con valores NA
. Si se calcula el promedio de una columna que se conoce contiene NA
, se debe colocar el argumento na.rm = TRUE
dentro de cada función para hacer esta obvie los NA
y calcule el estimados estadístico deseado. Por ejemplo mean(vector, na.rm = TRUE)
.
Ejemplo 6.15 Considerando la base de datos WHO
, calcular el promedio de la columna Life_exp
, la mediana de la columna Polio
, y el promedio y desviación estándar de GDP
. Agrupa previamente por año (columna Year
).
# Sin consideraro los NA
%>%
WHO group_by(Year) %>%
summarise(Promed = mean(Life_exp),
Pol = median(Polio),
GDP_prom = mean(GDP),
GDP_sd = sd(GDP)) %>%
ungroup()
# # A tibble: 16 × 5
# Year Promed Pol GDP_prom GDP_sd
# <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 2000 66.8 NA NA NA
# 2 2001 67.1 NA NA NA
# 3 2002 67.4 NA NA NA
# 4 2003 67.4 NA NA NA
# 5 2004 67.6 NA NA NA
# 6 2005 68.2 NA NA NA
# # … with 10 more rows
# Especificando el argumento na.rm = TRUE
# para obviar los NA de cada columna
%>%
WHO group_by(Year) %>%
summarise(Promed = mean(Life_exp, na.rm = TRUE),
Pol = median(Polio, na.rm = TRUE),
GDP_prom = mean(GDP, na.rm = TRUE),
GDP_sd = sd(GDP, na.rm = TRUE)) %>%
ungroup()
# # A tibble: 16 × 5
# Year Promed Pol GDP_prom GDP_sd
# <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 2000 66.8 88 4709. 9182.
# 2 2001 67.1 89 4855. 8892.
# 3 2002 67.4 91 4599. 8541.
# 4 2003 67.4 91 4775. 9144.
# 5 2004 67.6 91 7056. 13504.
# 6 2005 68.2 93 7250. 13107.
# # … with 10 more rows
6.9.1 Otras funciones de la familia summarise()
En dplyr existen algunas funciones que tienen versiones similares a ellas. Consideremos esta agrupaciones como familias de funciones. En estas familias, como la de summarise()
, encontrarás funciones de aplicación específica:
Función | Descripción |
---|---|
summarise() |
Permite realizar resúmenes estadísticos especificados columna a columna. |
summarise_all() |
Permite realizar resúmenes estadísticos aplicando una o más funciones a todas las columnas de la tabla. |
summarise_at() |
Permite realizar resúmenes estadísticos aplicando una o más funciones a un grupo de columnas de la tabla. |
summarise_if() |
Permite realizar resúmenes estadísticos aplicando una o más funciones si se cumple una condición lógica definida. |
summarise_each() |
Idéntica a summarise_all() es considerada obsoleta (deprecated). |
Variantes | Algunas funciones tienes variantes escritas con “_” al final o con la palabra summarize (con z), hacen lo mismo que las originales sin “_” o con summarise (con s). |
6.9.1.1 summarise_all()
Aplicará la o las funciones especificadas a todas las columnas. Si alguna columna no cumple con lo necesario para se analizada (por ejemplo: intentar obtener el promedio de una columna categórica), se genera error. Asegúrate de que la tabla por completo es analizable, o utiliza la función de dplyr select()
para seleccionar las columnas de trabajo antes de aplicar summarise_all()
. La estructura básica es:
%>%
BASE_DE_DATOS summarise_all(.funs = lst(LISTA_DE_FUNCIONES))
Ejemplo 6.16 Obtener el promedio, y varianza de las columnas GDP
, Life_exp
y Pop
por país de Colombia, México y Perú (recuerda que la base tiene estos nombres en inglés).
%>%
WHO filter(Country %in% c("Colombia","Mexico","Peru")) %>%
group_by(Country) %>%
::select(GDP, Life_exp, Pop) %>%
dplyrsummarise_all(.funs = lst(mean, var),
na.rm=TRUE)%>%
ungroup()
# Adding missing grouping variables: `Country`
# # A tibble: 3 × 7
# Country GDP_mean Life_exp_mean Pop_mean GDP_var Life_exp_var Pop_var
# <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 Colombia 3322. 73.3 31767433. 7555129. 1.16 4.08e14
# 2 Mexico 5179. 75.7 27585265. 15368266. 0.386 2.02e15
# 3 Peru 2929. 73.7 16854322. 5660203. 1.64 1.77e14
6.9.1.2 summarise_at()
Otra función muy útil al momento de aplicar diferentes funciones estadísticas a varias columnas es summarise_at()
. Esta función permite seleccionar las columnas de trabajo, como si incorporara su propia función select()
. La estructura básica es:
%>%
BASE_DE_DATOS summarise_at(.vars = vars(COLUMNAS_DE_TRABAJO),
.funs = lst(LISTA_DE_FUNCIONES))
Ejemplo 6.17 Siguiendo el ejemplo @ref:(exm:summariseall), recrear el resultado utilizando summarise_at()
:
%>%
WHO filter(Country %in% c("Colombia","Mexico","Peru")) %>%
group_by(Country) %>%
summarise_at(.vars = vars(GDP, Life_exp, Pop),
.funs = lst(mean, median, sd),
na.rm=TRUE)%>%
ungroup()
# # A tibble: 3 × 10
# Country GDP_mean Life_exp…¹ Pop_m…² GDP_m…³ Life_…⁴ Pop_m…⁵ GDP_sd Life_…⁶ Pop_sd
# <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 Colombia 3322. 73.3 3.18e7 2434. 73.5 4.30e7 2749. 1.08 2.02e7
# 2 Mexico 5179. 75.7 2.76e7 6976. 75.6 1.15e7 3920. 0.621 4.50e7
# 3 Peru 2929. 73.7 1.69e7 2601. 73.8 2.61e7 2379. 1.28 1.33e7
# # … with abbreviated variable names ¹Life_exp_mean, ²Pop_mean, ³GDP_median,
# # ⁴Life_exp_median, ⁵Pop_median, ⁶Life_exp_sd
6.9.1.3 summarise_if()
Aplicar condicionales para seleccionar columnas es muy útil. Esta función permite indicar una condición lógica con funciones de la familia is()
, como is.numeric()
que haría la petición de seleccionar solo las funciones numéricas y sobre todas ellas aplicar alguna función estadística. La estructura básica es:
%>%
BASE_DE_DATOS summarise_if(.predicate = FUNCIÓN_IS_SIN_PARÉNTESIS,
.funs = lst(LISTA_DE_FUNCIONES))
Ejemplo 6.18 Realizar el promedio y desviación estándar de las columnas numéricas que existan entre las siguientes: GDP
, Life_exp
, Pop
, Status1
, Status2
; agrupando por país para Colombia, México y Perú (recuerda que la base tiene estos nombres en inglés):
%>%
WHO filter(Country %in% c("Colombia","Mexico","Peru")) %>%
group_by(Country) %>%
::select(GDP, Life_exp, Pop, Status1, Status2) %>%
dplyrsummarise_if(is.numeric,
.funs = lst(mean, sd),
na.rm=TRUE)%>%
ungroup()