Conocer el entorno Rstudio como herramienta básica para utilizar el programa R.
Identificar las distintas ventanas de Rstudio y la utilidad de cada una.
Conocer y comenzar a utilizar documentos Rmarkdown como soporte para integrar texto y cálculos, y para producir como resultado documentos en html o docx reproducibles y con buena presentación.
Aprender a instalar (en el disco) y cargar (en memoria) algunas librerías que añaden nuevas capacidades a la instalación básica de R.
Aprender a leer datos desde archivos Excel.
Comenzar a utilizar las funciones del conjunto de librerías tidyverse para la manipulación y análisis de datos.
Conocer las posibilidades del paquete flextable para la generación de tablas bien formateadas.
Para el desarrollo de la práctica se utilizará el ordenador portátil que haya traído cada estudiante.
Antes de asistir a la práctica, se ha informado a los alumnos a través del campus virtual que para instalar R y Rstudio en sus ordenadores personales basta con descargar y ejecutar los programas de instalación (versiones de junio de 2020) que encontrarán en los siguientes enlaces directos:
Windows
Linux
Los siguientes enlaces muestran como se instalan R y Rstudio dependiendo de la distribución de Linux que se utilice (debian, ubuntu, redhat, suse):
Con los alumnos que hayan traído su ordenador portátil, durante la práctica simplemente se revisará que la instalación de R y Rstudio sea correcta o, en su caso, se ayudará a aquellos alumnos que hayan tenido alguna dificultad en la instalación.
Para la realización de las tareas que se describen a continuación se deberá crear un archivo Rmarkdown en el que se irá incluyendo el código R que se emplee, así como aquellos comentarios y texto que cada alumno juzgue oportuno para aclarar las distintas actividades que se irán realizando durante la práctica. El objetivo de utilizar este tipo de archivos es que el resultado final que se obtiene es un documento en html o word de alta calidad en el que quedan perfectamente integrados el texto con los resultados estadísticos (incluyendo tablas y gráficos) obtenidos con R.
Para crear y manipular un archivo Rmarkdown una vez arrancado Rstudio basta con seguir las instrucciones de este enlace donde además se explica el concepto y manejo básico de este tipo de archivos.
También aquí o aquí se pueden encontrar excelentes introducciones (en español) al uso de Rmarkdown.
Para aquellos alumnos aficionados a los tutoriales de Youtube, la Universitat de les Illes Balears tiene tres videos dedicados a RMarkdown: 1. R markdown, 2: Chunks en Rmarkdown y 3: Figuras en Rmarkdown. Otro video que puede resultar útil es RMarkdown para principiantes
Packages
).
Una librería en R es una colección de funciones que amplían la capacidad de la instalación base de R. Actualmente en R hay disponibles algo más de 15.000 librerías, orientadas a todo tipo de tareas: desde la importación de datos desde casi cualquier fuente posible, a la elaboración de mapas o páginas web, pasando por la implementación de una infinidad de métodos estadísticos. Antes de poder utilizar una librería es preciso descargarla e instalarla en nuestro disco duro. Podemos hacerlo de dos formas: directamente en la consola escribiendo install.packages("nombre del paquete a instalar")
o bien accediendo en Rstudio a la pestaña Packages:
:
y a continuación pinchando en Install
:
Se abrirá entonces esta ventana:
y bastará escribir aquí los nombres de los paquetes que queremos instalar. Es importante que esté marcada la casilla Install dependencies
, ya que muchos paquetes de R dependen de funciones que están contenidas en otros paquetes; es normal que cuando instalemos un paquete, R instale primero varios paquetes adicionales necesarios para que aquel funcione.
Para esta primera práctica instalaremos los siguientes paquetes:
readxl
: para la importación de archivos Excel.
tidyverse
: para la organización y manipulación de datos.
flextable
: para la elaboración de tablas listas para presentación
moments
: para el cálculo de algunos estadísticos descriptivos, en particular la asimetría (skewness) y el apuntamiento (kurtosis).
library()
Una vez instalados los paquetes anteriores procedemos a cargarlos en memoria mediante la función library()
. Si no se cargan en memoria, las funciones contenidas en estos paquetes no estarán disponibles. Insertamos un chunk
en nuestro archivo Rmarkdown, en el que introducimos el siguiente contenido:
El chunk
quedará así:
Si pinchamos en el triangulito verde que hemos destacado a la derecha en esta imagen, se ejecutarán todas las lineas del chunk
, y por tanto las librerías se cargarán en memoria y estaremos en condiciones de utilizarlas.
En todos los puntos que siguen en el desarrollo de esta práctica, el código R habrá de escribirse siempre dentro de un chunk
.
read_excel()
Usaremos los datos contenidos en el archivo datosP1.xlsx. Estos datos son un subconjunto de los utilizados para realizar esta presentación, basada en los resultados de un muestreo de nidos de tortuga Caretta caretta realizado en la isla de Boavista del archipiélago de Cabo Verde. Cada fila del archivo corresponde a un nido de tortuga, y cada columna a una variable: LCC, ACC y Peso son medidas de la tortuga que hizo el nido; Huevos el número de huevos del nido, distancia es la distancia desde el nido hasta la orilla, etc.
Para leer este archivo primero lo descargamos al ordenador. Si lo guardamos en la misma carpeta en la que se encuentra el archivo Rmarkdown con el que estamos trabajando no será preciso especificar la ruta en la que se encuentra, y para leerlo bastará con ejecutar:
Si el archivo se ha descargado, por ejemplo, en la carpeta Descargas
deberemos averiguar la ruta exacta de esa carpeta e incluirla antes del nombre del archivo:
Téngase en cuenta que aunque en Windows la denominación de la carpeta sea c:\Users\usuario\Downloads
(nótese que las barras van de izquierda a derecha, “\”), para que R sea capaz de leer el archivo, las barras separadoras deben escribirse de la forma “/”.
Lo que hemos hecho al utilizar este comando es asignar el contenido del archivo (que está en el disco duro del ordenador) a un objeto que está en la memoria ram y al que hemos denominado tortugas
. La asignación se realiza a través del operador “<-
”. A partir de ahora, cada vez que utilicemos el término tortugas
nos estaremos refiriendo al conjunto de datos que acabamos de leer.
NOTA: el objeto tortugas
es un objeto de clase tibble
(que podemos leer como “tabla”) o data.frame
(que podemos leer como “base de datos”). Los objetos de esta clase son tablas en las que cada fila representa un objeto (un nido en este caso) y cada columna una variable. Las variables de un mismo tibble
pueden ser de distinta naturaleza, tanto numéricas como de tipo carácter.
Muchas de las funciones del paquete tidyverse
están diseñadas para recibir tibbles
como entrada y devolver tibbles
como salida.
count()
Comenzamos ahora a utilizar funciones de las librerías del paquete tidyverse
. La función count()
cuenta el número de filas del conjunto de datos. Como cada fila es un nido, count()
nos proporciona el número de nidos que se han medido en el muestreo.
Para aplicar esta función utilizaremos el operador pipe
(tubería) denotado mediante “%>%
”. La sintaxis “tortugas %>% count()
” puede leerse como que hacemos pasar a la base de datos tortugas
a través de una tubería que la lleva hasta count()
de donde sale el número de filas del archivo:
## # A tibble: 1 x 1
## n
## <int>
## 1 20
Nótese que el resultado de la función count()
es una tabla (tibble
).
flextable()
Como acabamos de ver, la función count()
nos ha devuelto el número de nidos de nuestro muestreo. Sin embargo, la presentación en el documento resultante dista mucho de ser elegante. Si queremos que nuestros resultados tengan buena presentación es preciso aplicarles una capa de “maquillaje”. Esto lo podemos hacer mediante la función flextable()
, del paquete homónimo:
n |
20 |
El paquete flextable
permite generar tablas con muy buena presentación, pensadas para que se inserten directamente en documentos html o word.
group_by()
La utilización de las “tuberías” (%>%
) junto con las funciones del tidyverse
permite reutilizar el código de manera muy simple para aplicar una misma función a los datos agrupados según los valores de alguna variable de interés. Así, por ejemplo, si quisiéramos saber cuántos nidos tenemos en cada playa, bastaría emplear el mismo código del punto anterior indicando group_by(playa)
justo antes de aplicar count()
:
playa | n |
Calheta | 9 |
Ervatao | 4 |
Ponta Cosme | 6 |
Porto Ferreiro | 1 |
Nótese que en este caso hemos cambiado de línea tras aplicar cada “tubería”. El programa funciona igual pero el código es más legible.
summarise()
La función summarise()
es la encargada de aplicar medidas de resumen (media, desviación típica, mediana, asimetrías, etc) a las variables de un tibble
. Por ejemplo, para calcular el valor medio de la variable LCC (longitud curva del caparazón) procederíamos del siguiente modo:
## # A tibble: 1 x 1
## `mean(LCC)`
## <dbl>
## 1 81.6
summarise()
Si queremos calcular las medias de dos (o más) variables distintas, bastará con indicarlo dentro del summarise()
:
## # A tibble: 1 x 2
## `mean(ACC)` `mean(peso)`
## <dbl> <dbl>
## 1 76.2 59.8
flextable()
+ autofit()
Para ello bastará indicar las tres medias que queremos calcular y aplicar flextable()
a continuación:
mean(LCC) | mean(ACC) | mean(peso) |
81.63 | 76.24 | 59.765 |
Véase que el nombre de las columnas queda dividido en dos lineas. Podemos conseguir que flextable
ajuste automáticamente el ancho de columna mediante autofit()
:
mean(LCC) | mean(ACC) | mean(peso) |
81.63 | 76.24 | 59.765 |
flextable
: tamaño de letra, ancho de columna, título de tabla y decimales.
El paquete flextble
contiene numerosas funciones para mejorar el aspecto de las tablas. Veremos ahora como modificar cosas como el tamaño de letra, el ancho de columna, el título de la tabla o los decimales de los valores numéricos que contiene.
En los ejemplos anteriores la letra de las tablas resulta un poco pequeña. Podemos hacerla más grande utilizando la función fontsize()
, indicando si lo que queremos hacer más grande es la cabecera (part="header"
), el cuerpo de la tabla (part="body"
) o toda la tabla (part="all"
):
tortugas %>% summarise(mean(LCC),
mean(ACC),
mean(peso)) %>%
flextable() %>%
fontsize(size=14, part="all") %>%
autofit()
mean(LCC) | mean(ACC) | mean(peso) |
81.63 | 76.24 | 59.765 |
Si además queremos cambiar el ancho de alguna columna, utilizaremos la función width
, indicando qué columna(s) queremos modificar y qué ancho queremos poner; por ejemplo, si queremos que el ancho de las columnas 2 y 3 sea 1.5, y el de la columna 1 sea 2:
tortugas %>% summarise(mean(LCC),
mean(ACC),
mean(peso)) %>%
flextable() %>%
fontsize(size=14, part="all") %>%
width(2:3,width=1.5) %>%
width(1,width=2)
mean(LCC) | mean(ACC) | mean(peso) |
81.63 | 76.24 | 59.765 |
Podemos añadir fácilmente un título a la tabla mediante la función set_caption()
. En la sintaxis siguiente, dentro del summarise asignamos un nombre a cada media, y ponemos un titulo:
tortugas %>% summarise(LCC=mean(LCC),
ACC=mean(ACC),
Peso=mean(peso)) %>%
flextable() %>%
fontsize(size=14, part="all") %>%
width(2:3,width=1.5) %>%
set_caption("Valores medios de las variables morfométricas de las tortugas")
LCC | ACC | Peso |
81.63 | 76.24 | 59.765 |
Si en la tabla anterior queremos mostrar los datos solamente con dos decimales utilizamos la función colformat_num()
. Si no especificamos columnas, se aplica este formato a todas las columnas numéricas:
tortugas %>% summarise(LCC=mean(LCC),
ACC=mean(ACC),
Peso=mean(peso)) %>%
flextable() %>%
fontsize(size=14, part="all") %>%
width(2:3,width=1.5) %>%
colformat_num(digits=2) %>%
set_caption("Valores medios de las variables morfométricas de las tortugas")
LCC | ACC | Peso |
81.63 | 76.24 | 59.77 |
Por último, si quisiéramos especificar distintos decimales para distintas variables podemos hacerlo del siguiente modo. Nótese que además utilizamos autofit()
para que ajuste automáticamente el ancho de las columnas:
tortugas %>% summarise(LCC=mean(LCC),
ACC=mean(ACC),
Peso=mean(peso)) %>%
flextable() %>%
fontsize(size=14, part="all") %>%
colformat_num("ACC",digits=2) %>%
colformat_num(c("LCC","Peso"),digits=4) %>%
autofit() %>%
set_caption("Valores medios de las variables morfométricas de las tortugas")
LCC | ACC | Peso |
81.6300 | 76.24 | 59.7650 |
group_by()
Nuevamente, si queremos aplicar la misma función a los datos agrupados según los valores de una variable usaremos group_by()
:
tortugas %>%
group_by(playa) %>%
summarise(mean(LCC),mean(ACC),mean(peso)) %>%
flextable() %>%
fontsize(size=14,part="all") %>%
autofit()
playa | mean(LCC) | mean(ACC) | mean(peso) |
Calheta | 82.58889 | 76.67778 | 62.54444 |
Ervatao | 80.85000 | 76.77500 | 56.60000 |
Ponta Cosme | 80.05000 | 74.91667 | 57.88333 |
Porto Ferreiro | 85.60000 | 78.10000 | 58.70000 |
Aquí hemos empleado la función autofit()
que se encarga de ajustar automáticamente el alto y ancho de las filas y columnas de la tabla presentada con flextable()
.
group_by()
tortugas %>%
group_by(Año) %>%
summarise(mean(LCC), mean(ACC), mean(peso)) %>%
flextable() %>%
fontsize(size=14,part="all") %>%
autofit()
Año | mean(LCC) | mean(ACC) | mean(peso) |
1999 | 85.07500 | 77.70000 | 63.92500 |
2000 | 79.35000 | 76.70000 | 51.90000 |
2001 | 79.86667 | 74.40000 | 56.80000 |
2002 | 80.62000 | 74.40000 | 59.84000 |
2003 | 81.60000 | 75.63333 | 61.03333 |
2004 | 82.03333 | 79.50000 | 61.03333 |
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(n(),
mean(LCC),
sd(LCC),
skewness(LCC),
kurtosis(LCC),
min(LCC),max(LCC),
median(LCC))
## # A tibble: 1 x 8
## `n()` `mean(LCC)` `sd(LCC)` `skewness(LCC)` `kurtosis(LCC)` `min(LCC)`
## <int> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 20 81.6 2.91 0.0750 2.07 77.1
## # … with 2 more variables: `max(LCC)` <dbl>, `median(LCC)` <dbl>
Importante: nótese que hemos puesto LCC
como argumento en todas las funciones menos en n()
. Ello es debido a que la función n()
en realidad no cuenta el número de valores de LCC
sino el número de filas del data.frame sobre el que se está ejecutanto el summarise
(en este caso, tortugas), que tiene 20 filas. Si escribiéramos n(LCC)
R nos devolvería un error:
## Error in n(LCC): unused argument (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_num(digits=2)
. Por último asigna nombre a la tabla con set_caption()
.
tortugas %>%
summarise(media=mean(LCC),
sd=sd(LCC),
asimetria=skewness(LCC),
apuntamiento=kurtosis(LCC),
minimo=min(LCC),
mediana=median(LCC),
maximo=max(LCC)) %>%
flextable() %>%
colformat_num(digits=2) %>%
fontsize(size=12,part="all") %>%
autofit() %>%
set_caption("Descripción de la variable LCC")
media | sd | asimetria | apuntamiento | minimo | mediana | maximo |
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:
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:
## # A tibble: 1 x 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:
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:
lo que nos mostrará todas las variables en Rstudio:
summarise()
Describe la variable anterior mediante las mismas medidas descriptivas de la pregunta 1 de esta práctica. Simplifica dicha descripción creando una lista de funciones.
Podemos crear fácilmente una lista de las funciones que queremos aplicar mediante:
listaFunciones=list(n=n,
media=mean,
sd=sd,
asimetria=skewness,
curtosis=kurtosis,
min=min,
mediana=median,
max=max)
Y ahora, para aplicar esta lista de funciones a la variable superf
ejecutamos:
## Error in (function () : unused argument (superf)
Como vemos, R nos ha devuelto el error unused argument (superf) . ¿A qué se debe este mensaje? Recordemos que en la pregunta 1 vimos que la función n()
no puede recibir ningún argumento. El mensaje de error que estamos viendo se debe precisamente a que cuando se ha pasado la variable superf
a la lista de funciones, hay una función de esa lista (la función n()
) que recibe un argumento (superf
) que no usa.
Podemos sustituir la función n()
por la función length()
que sí que nos da la longitud (número de valores) de la variable a la que se aplique:
listaFunciones=list(n=length,
media=mean,
sd=sd,
asimetria=skewness,
curtosis=kurtosis,
min=min,
mediana=median,
max=max)
tortugas %>%
summarise_at(vars(superf), listaFunciones) %>%
flextable() %>% autofit()
n | media | sd | asimetria | curtosis | min | mediana | max |
20 | 0.4897684 | 0.02899563 | 0.07120863 | 2.228814 | 0.4370866 | 0.4861427 | 0.5443251 |
Nota 1: Dentro de vars()
se pueden especificar varias variables, y R aplicaría la lista de funciones a cada una de ellas, si bien la presentación del resultado no es demasiado elegante:
LCC_n | ACC_n | LCC_media | ACC_media | LCC_sd | ACC_sd | LCC_asimetria | ACC_asimetria | LCC_curtosis | ACC_curtosis | LCC_min | ACC_min | LCC_mediana | ACC_mediana | LCC_max | ACC_max |
20 | 20 | 81.63 | 76.24 | 2.908083 | 2.647819 | 0.07495546 | 0.3482047 | 2.067325 | 2.245906 | 77.1 | 72.1 | 81.6 | 75.95 | 86.7 | 81.4 |
Nota 2: En R los valores perdidos se denotan mediante NA
. La función length()
cuenta el número de valores que tiene una variable, incluyendo los perdidos. En la próxima práctica veremos como construir una función que cuente el número de valores válidos y perdidos que tiene una variable.