summarise(): para resumir variables mediante
diversos estadísticos descriptivos.
summarise_at(): para obtener resúmenes estadísticos
aplicados a determinadas variables.
mutate(): para la creación de nuevas
variables.
mean()sd()median()max() y min()moments() para el cálculo de
medidas de forma como la asimetría y el apuntamiento.
library(readxl)
library(tidyverse)
library(flextable)
library(moments) tortugas <- read_excel("datosP1-1920.xlsx")
summarise.Calcula el número de observaciones, la media, desviación típica, Asimetria, Curtosis, mínimo, máximo y Mediana de la variable LCC (NOTA: asimetría y curtosis están en library(moments)).
tortugas %>%
summarise(sum(!is.na(LCC)),
mean(LCC),
sd(LCC),
skewness(LCC),
kurtosis(LCC),
min(LCC),max(LCC),
median(LCC)) ## # A tibble: 1 × 8
## `sum(!is.na(LCC))` `mean(LCC)` sd(LC…¹ skewn…² kurto…³ min(L…⁴ max(L…⁵ media…⁶
## <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 20 81.6 2.91 0.0750 2.07 77.1 86.7 81.6
## # … with abbreviated variable names ¹`sd(LCC)`, ²`skewness(LCC)`,
## # ³`kurtosis(LCC)`, ⁴`min(LCC)`, ⁵`max(LCC)`, ⁶`median(LCC)`
Importante: para contar el número de valores válidos
en la variable LCC hemos usado la función
is.na(); esta variable vale 1 si el valor está “perdido”
(nasignifica not assigned, lo que quiere decir
que el valor no se ha registrado) y vale 0 si el valor es válido.
Asimismo, el símbolo ! indica negación; es decir
!is.na(LCC) identifica los valores que no
están perdidos en la variable LCC; cuando el valor es
válido !is.na() vale 1 y cuando está perdido vale 0; por
tanto sum(!is.na(LCC)) cuenta el número de valores válidos
dentro de la variable LCC.
Presenta los resultados anteriores asignando un nombre a cada
columna y conviértelos en una tabla (usando flextable()).
Ajusta el ancho de columna con autofit() y el número de
dígitos decimales con colformat_double(digits=2). Por
último asigna nombre a la tabla con
set_caption().
tortugas %>%
summarise(n=sum(!is.na(LCC)),
media=mean(LCC),
sd=sd(LCC),
asimetria=skewness(LCC),
apuntamiento=kurtosis(LCC),
minimo=min(LCC),
mediana=median(LCC),
maximo=max(LCC)) %>%
flextable() %>%
colformat_double(digits=2) %>%
fontsize(size=12,part="all") %>%
autofit() %>%
set_caption("Descripción de la variable LCC")n | media | sd | asimetria | apuntamiento | minimo | mediana | maximo |
20 | 81.63 | 2.91 | 0.07 | 2.07 | 77.10 | 81.60 | 86.70 |
mutate().Se puede obtener un valor aproximado de la superficie (en \(m^2\)) del caparazón mediante la siguiente expresión:
\[ Sup = \pi \cdot \left(\frac{LCC+ACC}{400}\right)^2\]
Calcula la superficie aproximada de los caparazones de las tortugas de la muestra.
La función mutate() permite crear una nueva variable. Su
sintaxis es de la forma:
tortugas %>%
mutate(superf=pi*((LCC+ACC)/400)^2)De esta forma R calcula los valores de superf para cada
tortuga de la muestra y nos los enseña por pantalla. Si simplemente
quisiéramos calcular la superficie media de todos los caparazones,
podríamos ejecutar:
tortugas %>%
mutate(superf=pi*((LCC+ACC)/400)^2) %>%
summarise(mean(superf))## # A tibble: 1 × 1
## `mean(superf)`
## <dbl>
## 1 0.490
Es importante señalar que la nueva variable superf
no se ha guardado en ningún sitio. Si queremos guardar
esta nueva variable dentro del data.frame tortugas para
reutilizarla más adelante en nuestro análisis de los datos, deberemos
reasignar el resultado del mutate() de nuevo a
tortugas del modo siguiente:
tortugas <- tortugas %>%
mutate(superf=pi*((LCC+ACC)/400)^2)Esta sintaxis puede leerse de la forma:
“En
tortugasmetemos el resultado (<-) de coger el data.frametortugastransformándolo (%>% mutate) mediante la creación de una nueva variablesuperfcalculada comopi*((LCC+ACC)/400)^2”
Podemos comprobar que ahora el data.frame tortugas tiene
una variable más ejecutando:
View(tortugas)lo que nos mostrará todas las variables en Rstudio:
Obviamente, una vez creada esta variable, podemos utilizarla como el
resto de variables en el archivo. La misma sintaxis que hemos utilizado
con LCC nos permite describir las características de la
variable superf:
tortugas %>%
summarise(n=sum(!is.na(superf)),
media=mean(superf),
sd=sd(superf),
asimetria=skewness(superf),
apuntamiento=kurtosis(superf),
minimo=min(superf),
mediana=median(superf),
maximo=max(superf)) %>%
flextable() %>%
colformat_double(digits=2) %>%
fontsize(size=12,part="all") %>%
autofit() %>%
set_caption("Descripción de la variable LCC")n | media | sd | asimetria | apuntamiento | minimo | mediana | maximo |
20 | 0.49 | 0.03 | 0.07 | 2.23 | 0.44 | 0.49 | 0.54 |
Supongamos que queremos calcular el valor medio de todas las variables numéricas de la muestra. Una manera de hacerlo sería especificar el cálculo de la media variable a variable:
tortugas %>%
summarize(mean(LCC), mean(ACC),mean(peso),mean(Huevos),mean(distancia),
mean(profNido),mean(crias_Emerg),mean(crias_Muertas),mean(hrotos)) ## # A tibble: 1 × 9
## `mean(LCC)` mean(ACC…¹ mean(…² mean(…³ mean(…⁴ mean(…⁵ mean(…⁶ mean(…⁷ mean(…⁸
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 81.6 76.2 59.8 80.9 21.2 55.2 NA NA NA
## # … with abbreviated variable names ¹`mean(ACC)`, ²`mean(peso)`,
## # ³`mean(Huevos)`, ⁴`mean(distancia)`, ⁵`mean(profNido)`,
## # ⁶`mean(crias_Emerg)`, ⁷`mean(crias_Muertas)`, ⁸`mean(hrotos)`
Como vemos en las últimas variables el valor mostrado es
NA. Ello se debe a que dichas variables contienen valores
perdidos, y por defecto en tales casos R devuelve NA como
manera de hacernos notar esa circunstancia. No obstante, si ya somos
conscientes de que hay valores perdidos, y queremos que R calcule la
media del resto de valores, bastará con especificar la opción
na.rm=TRUE (que viene a significar que se eliminan
(rm remove) los valores perdidos (NA)
en el cálculo de la media):
tortugas %>%
summarize(mean(LCC), mean(ACC),mean(peso),mean(Huevos),mean(distancia),
mean(profNido),mean(crias_Emerg,na.rm=TRUE),mean(crias_Muertas,na.rm=TRUE),
mean(hrotos,na.rm=TRUE)) %>%
flextable() %>%
autofit()mean(LCC) | mean(ACC) | mean(peso) | mean(Huevos) | mean(distancia) | mean(profNido) | mean(crias_Emerg, na.rm = TRUE) | mean(crias_Muertas, na.rm = TRUE) | mean(hrotos, na.rm = TRUE) |
81.63 | 76.24 | 59.765 | 80.9 | 21.195 | 55.235 | 29.75 | 1.6875 | 49.9375 |
R nos ofrece la posibilidad de simplificar la sintaxis anterior
utilizando la función across() en la que se indican los
nombres de las variables sobre las cuales se quiere aplicar el cálculo
de la media:
tortugas %>%
summarize(across(c(LCC, ACC, Huevos, distancia, profNido, crias_Emerg,crias_Muertas,hrotos),mean,na.rm=TRUE)) %>%
flextable() %>%
autofit()LCC | ACC | Huevos | distancia | profNido | crias_Emerg | crias_Muertas | hrotos |
81.63 | 76.24 | 80.9 | 21.195 | 55.235 | 29.75 | 1.6875 | 49.9375 |
Nótese que los nombres de las variables se han especificado dentro de
la función de concatenación c(); asimismo basta con
escribir na.rm=TRUE una única vez al final de la función
across().
Por último, señalemos que si se desea presentar estos resultados con
una fila para cada variable podemos hacerlo utilizando la función
pivot_longer(). Esta función permite cambiar datos que
están escritos a lo ancho en datos que están escritos a lo
largo (de ahí el nombre, pivot_longer). La sintaxis
sería la siguiente:
tortugas %>%
summarize(across(c(LCC, ACC, Huevos, distancia, profNido, crias_Emerg,crias_Muertas,hrotos),mean,na.rm=TRUE)) %>%
pivot_longer(everything(),names_to = "Variable", values_to = "Media") %>%
flextable() %>%
autofit()Variable | Media |
LCC | 81.6300 |
ACC | 76.2400 |
Huevos | 80.9000 |
distancia | 21.1950 |
profNido | 55.2350 |
crias_Emerg | 29.7500 |
crias_Muertas | 1.6875 |
hrotos | 49.9375 |
Nótese que hemos usado la opción names_to para indicar
el nombre de la columna en la que irían los nombres de las
variables del conjunto anterior; y values_to para indicar el
nombre de la columna donde irían los valores numéricos, que en este
ejemplo son las medias de las distintas variables.
La siguiente sintaxis nos permitiría obtener la desviación típica de cada variable:
tortugas %>%
summarize(across(c(LCC, ACC, Huevos, distancia, profNido, crias_Emerg,crias_Muertas,hrotos),sd,na.rm=TRUE)) %>%
pivot_longer(everything(),names_to = "Variable", values_to = "sd") %>%
flextable() %>%
autofit()Variable | sd |
LCC | 2.908083 |
ACC | 2.647819 |
Huevos | 14.407235 |
distancia | 7.189208 |
profNido | 7.095015 |
crias_Emerg | 25.689168 |
crias_Muertas | 2.774137 |
hrotos | 24.346030 |
Si queremos combinar las dos tablas anteriores en una única tabla que nos muestre media y desviación típica podríamos hacer lo siguiente:
medias <- tortugas %>%
summarize(across(c(LCC, ACC, Huevos, distancia, profNido, crias_Emerg,crias_Muertas,hrotos),mean,na.rm=TRUE)) %>%
pivot_longer(everything(),names_to = "Variable", values_to = "Media")
desviaciones <- tortugas %>%
summarize(across(c(LCC, ACC, Huevos, distancia, profNido, crias_Emerg,crias_Muertas,hrotos),sd,na.rm=TRUE)) %>%
pivot_longer(everything(),names_to = "Variable", values_to = "sd")
full_join(medias,desviaciones) %>%
flextable() %>%
colformat_double(digits=2) %>%
autofit() %>%
set_caption("Medias y desviaciones típicas")Variable | Media | sd |
LCC | 81.63 | 2.91 |
ACC | 76.24 | 2.65 |
Huevos | 80.90 | 14.41 |
distancia | 21.20 | 7.19 |
profNido | 55.23 | 7.10 |
crias_Emerg | 29.75 | 25.69 |
crias_Muertas | 1.69 | 2.77 |
hrotos | 49.94 | 24.35 |
Por último, supongamos que en la tabla anterior queremos añadir
además el número de valores válidos en cada variable. Ya hemos visto que
para ello debemos utilizar
sum(!is.na(nombre_de_la_variable)). Si empleamos esta
expresión en el across() obtenemos un error:
tortugas %>%
summarize(across(c(LCC, ACC, Huevos, distancia, profNido, crias_Emerg,crias_Muertas,hrotos),sum(!is.na))) %>%
flextable() %>%
autofit()## Error in `summarize()`:
## ℹ In argument: `across(...)`.
## Caused by error in `!is.na`:
## ! argumento de tipo inválido
Ello es debido a que aquí estamos utilizando realmente tres
funciones: sum(), is.na() y !
combinadas. Si queremos que sum(!is.na()) sea identificada
como una única función dentro de across() debemos
precederla del símbolo ~ e indicar entre paréntesis como
argumento .x, tal como se muestra a continuación:
tortugas %>%
summarize(across(c(LCC, ACC, Huevos, distancia, profNido, crias_Emerg,crias_Muertas,hrotos),
~sum(!is.na(.x))))## # A tibble: 1 × 8
## LCC ACC Huevos distancia profNido crias_Emerg crias_Muertas hrotos
## <int> <int> <int> <int> <int> <int> <int> <int>
## 1 20 20 20 20 20 16 16 16
Para combinar la media, desviación típica y número de valores válidos
en una única tabla procedemos como antes, usando un segundo
full_join() para añadir la nueva tabla con los valores
válidos en cada variable:
n <- tortugas %>%
summarize(across(c(LCC, ACC, Huevos, distancia, profNido, crias_Emerg,crias_Muertas,hrotos),~sum(!is.na(.x)))) %>%
pivot_longer(everything(),names_to = "Variable", values_to = "n")
full_join(medias,desviaciones) %>%
full_join(n) %>%
flextable() %>%
colformat_double(digits=2) %>%
autofit() %>%
set_caption("Medias, desviaciones típicas y n válido")Variable | Media | sd | n |
LCC | 81.63 | 2.91 | 20 |
ACC | 76.24 | 2.65 | 20 |
Huevos | 80.90 | 14.41 | 20 |
distancia | 21.20 | 7.19 | 20 |
profNido | 55.23 | 7.10 | 20 |
crias_Emerg | 29.75 | 25.69 | 16 |
crias_Muertas | 1.69 | 2.77 | 16 |
hrotos | 49.94 | 24.35 | 16 |