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)
<- read_excel("datosP1-1920.xlsx") tortugas
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”
(na
significa 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
tortugas
metemos el resultado (<-
) de coger el data.frametortugas
transformándolo (%>% mutate
) mediante la creación de una nueva variablesuperf
calculada 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:
<- tortugas %>%
medias 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")
<- tortugas %>%
desviaciones 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:
<- tortugas %>%
n 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 |