En este taller aprenderemos a reconocer los distintos elementos en la interfaz de RStudio, estructuras en R y manejo de datos con Tidyverse.
R es un lenguaje de programación y un entorno de software utilizado en la práctica estadística y el análisis de datos. R y RStudio son herramientas esenciales para el estudio, análisis y toma de decisiones en salud pública, ya que permiten realizar análisis estadísticos detallados, modelar la propagación de enfermedades, visualizar datos de manera efectiva y automatizar tareas. Estas herramientas facilitan la manipulación y preparación de datos, fomentan la colaboración en proyectos de ciencia de datos, y la toma de decisiones basadas en evidencias. Además, son útiles en la formación y educación en análisis de datos para profesionales de la salud, áreas STEM y toma de decisiones.
En esta práctica se desarrollarán los siguientes conceptos:
R es un lenguaje de programación especializado para análisis de datos, es de uso gratuito y software libre. Por otra parte, RStudio es un editor de R también disponible de manera gratuita. En los últimos años el uso de R ha crecido en el ámbito académico y de la industria. R, además de ser un lenguaje de programación, es también un entorno para computación estadística y creación de gráficos. R además de ser un lenguaje de programación es un entorno para computación estadística y creación de gráficos. R-project
La parte visual de RStudio está compuesta por 4 secciones principales:
Editor (sección superior izquierda): esta sección es fundamental para la reproducibilidad del código. Este editor permite guardar el código para que sea usado en futuras ocasiones. El código puede ser ejecutado en esta sección posicionando el cursor de texto al final de la línea de código que se ejecutará; otra opción es seleccionando la misma y empleando el comando Control+Enter para Windows o Command+Enter para Mac.
Entorno (sección superior derecha): en esta sección se pueden visualizar los objetos y funciones creados o importados en la sección de R. Objetos como vectores, matrices, arreglos, data frames, listas, objetos tipo ggplot, entre otros.
Consola (sección inferior izquierda): esta sección es donde se ejecuta el código. No solo se ejecuta el código que escrito en el editor, sino que también el código puede escribirse y ejecutarse aquí directamente presionando Enter. Sin embargo, cuando el código se ejecuta directamente en la consola, este no se almacena y cuando se cierra la sesión de R este se pierde.
Visualizador (sección inferior derecha): en esta sección se pueden visualizar los archivos en “Files”, los gráficos en “Plots”, los paquetes que ya están instalados en “Packages”, la ayuda de R con información de los paquetes y el funcionamiento en “Help”, y páginas web en “Viewer”.
Una de las grandes ventajas de usar RStudio es la posibilidad de usar
los Proyectos en R (R Project)(indicado por un archivo
.Rproj
) lo que permite organizar el espacio de trabajo, el
historial y los documentos fuente.
Para crear un Proyecto en R, es importante seguir los siguientes pasos:
Screenshot New Directory
En la ventana Project Type, para crear un nuevo proyecto en Rstudio se debe seleccionar New Project -> Create New Project. En la casilla Directory Name (Nombre del Directorio) coloque el nombre deseado para su proyecto (e.g. “introR”).
Seleccione el botón Browse…. En este punto, es conveniente crear una carpeta que servirá de repositorio para su proyecto, así como las sub carpetas que necesita para organizar su trabajo (por ejemplo: datos, scripts, figuras). Una vez creadas, seleccione la carpeta que servirá de repositorio.
Al final, su proyecto debería parecerse a esta imagen
Screenshot R Project
En R, un vector es una estructura de datos indexada que permite almacenar varios elementos del mismo tipo en una única variable. Por ejemplo, podríamos tener un vector que contenga las edades de varias personas, o un vector que contenga los nombres de diferentes ciudades.
Los vectores en R son útiles porque permiten realizar operaciones y cálculos con facilidad. Los elementos del vector se pueden sumar, restar, multiplicar o dividir, y sus elementos son accesibles por medio posición o índice.
En resumen, un vector en R es una colección ordenada de elementos del mismo tipo que permite almacenar y manipular datos de manera eficiente. Es una herramienta fundamental para trabajar con datos en R y realizar diferentes tipos de análisis y operaciones.
Los vectores se pueden crear ejecutando el comando c()
,
como se puede visualizar a continuación:
nombre <- c("Ana", "Miguel", "Juan", "Lina") # Nombre de las personas
ciudad <- c("Cali","Bogota", "Medellin", "Bogota") # Ciudad de residencia
edad <- c(15, 25, 32, 40) # Edad de las personas
vacunado <- c(TRUE, FALSE, FALSE, TRUE) # Estado de vacunación
dosis <- c(1L, 0L, 0L, 2L) # Número de dosis recibidas
Imaginemos un Data.frame como una tabla con filas y columnas, similar a una hoja de cálculo en Excel. Cada columna representa un tipo de información específica o variable (Por ejemplo, la edad, el departamento o nombre) y cada fila representa un conjunto de datos relacionados. Es importante tener en cuenta que los Data.frame (Tabla de datos) están compuestas por vectores cuyas dimensiones deben ser iguales, es decir que todas las columnas deben tener el mismo número de filas.
En R, un data frame es una forma muy útil de almacenar y organizar datos. Puede pensarse como una forma de mantener diferentes tipos de información juntos en una estructura organizada. Por ejemplo, se puede tener una columna para los nombres de las personas, otra para sus edades y otra para el departamento en el que viven.
La gran ventaja de un Data.frame es que permite realizar operaciones y análisis sobre los datos de manera ágil y eficiente. Se pueden realizar cálculos, filtrar datos, realizar gráficos y mucho más.
En resumen, un Data.frame en R es una tabla conformada por columnas con el mismo número de filas que permite almacenar y trabajar con diferentes tipos de datos de manera organizada y eficiente. Por lo tanto, es una herramienta poderosa para el análisis y manipulación de datos en R.
Para crear una tabla de datos se debe ejecutar el comando
data.frame()
. Por ejemplo, utilizando los vectores que
definimos en la sección anterior:
datos_vacunas <- data.frame(
nombre = nombre,
ciudad = ciudad,
edad = edad,
vacunado = vacunado,
dosis = dosis)
Tiene las siguientes propiedades:
colnames()
: nombres de las columnasrownames()
: nombres de las filasnrow()
: número de filasncol()
: número de columnaslength()
: longitud de la tabla de datosPara acceder a la estructura general de una tabla de datos (y en
general cualquier objeto de R) usamos el comando str
str(datos_vacunas)
Para acceder a los diferentes componentes de la tabla de datos usamos
esta sintaxis [,]
, donde la primera dimensión corresponde a
filas y la segunda dimensión a columnas.
datos_vacunas[1, 2]
También es posible acceder a la información a partir de los nombres de las columnas.
datos_vacunas$nombre
R permite a los usuarios no solo abrir, sino también crear tablas de datos. Hay tres fuentes de conjuntos de datos:
.xlsx
,
.csv
, .stata
, o .RDS
, entre
otros)Para importar una tabla de datos de diferentes fuentes necesitamos emplear diferentes tipos de funciones, aquí algunos ejemplos del tipo de datos, el paquete que es necesario cargar y la función a utilizar.
Tipo de datos | Función | Paquete |
---|---|---|
csv | read_csv | readr |
xls | read_excel, read_xls,read_xlsx | readxl |
RDS | readRDS | base |
dta | read_dta | haven |
sas | read_sas | haven |
sav | read_spss | haven |
R tiene la capacidad de almacenar y procesar distintos tipos de datos. Entre estos se encuentran:
Datos numéricos fraccionados (double. Ej: 3.3)
Datos enteros (integer. Ej: 3)
Datos en caracteres (character)
Tipos de datos booleanos/ Datos lógicos (logic. Ej: FALSE, TRUE)
Datos factor (factor. Sirven para categorizar. Ej: femenino, masculino, otro o primero, segundo.)
Datos tipo fechas (date. Ej: 01/01/2022)
Datos NA, NAN e Inf
Los operadores herramientas matemáticas que nos permiten realizar
diferentes tareas con los datos que tenemos disponibles; por ejemplo,
con el operador +
podemos efectuar una suma o incrementar
un índice. Algunos de los operadores más utilizados en R son los
siguientes:
Operadores aritméticos (Ej: +, -, *)
Operadores de comparación (Ej: <, >, ==, >=, <=, !=)
Operadores booleanos (& (and), | (or), ! (not))
Imagina una función como una especie de “caja mágica” que recibe ciertos datos o información como entrada y produce un resultado o respuesta específica como salida. Es como seguir una receta que toma ingredientes y como resultado obtienes un plato delicioso.
Por ejemplo, considere la función \(y(x)=x+1\). Si ingresamos un dato \(x\) (en el caso de la imagen, \(x=1\)), y aplicamos la función, obtendremos como salida el dato \(y(1)=1+1=2\).
Esquema de la función \(y(x)=x+1\).
En general, una función consiste de una secuencia de instrucciones con el fin de llevar a cabo una tarea. De esta forma, por medio del uso de funciones es posible sistematizar procesos complejos que se realizan de manera rutinaria.
Los componentes básicos de una función son:
Para administrar mejor los conjuntos de datos, se recomienda instalar
y utilizar el paquete tidyverse
, el cual carga
automáticamente varios paquetes (dplyr, tidyr, tibble, readr, purr,
entre otros) que son útiles para la manipulación de datos.
install.packages('tidyverse')
library(tidyverse)
Abrir y explorar una tabla de datos importados de Excel
Este es el conjunto de datos para esta práctica: datos_covid.xlsx:
Dentro del directorio en el que está trabajando actualmente, cree una carpeta llamada data. Guarde la tabla de datos descargado en la carpeta data que acaba de crear.
Para importar tablas de datos desde RDS, se puede usar la función
read_excel
, que está en el paquete
readxl
vinculado a tidyverse. Sin embargo, todavía es
necesario cargar la biblioteca readxl, ya que no es un paquete tidyverse
principal.
library(readxl)
dat <- read_excel("data/datos_covid.xlsx")
A continuación, verá algunas de las funciones más utilizadas de
tidyverse
.
El operador tubería (pipe function) %>%
es un
operador que se usa continuamente, por lo que es clave para usar
Tidyverse y facilita la programación. El operador tubería permite al
usuario enfatizar una secuencia de acciones en un objeto.
#### Ejemplos Ejemplo 1 La siguiente línea de
código
str(datos_vacunas)
es equivalente a:
datos_vacunas %>% str()
Ejemplo 2 Supongamos que necesitamos sumarle 1 a una lista de números, luego multiplicar todos sus elementos por 2 y a continuación calcular su promedio. Sin el uso de el operador tubería, estas operaciones se pueden realizar de la siguiente manera:
lista_numeros <- c(5, 10, 15, 20)
suma_uno <- lista_numeros + 1
multiplicado_por_dos <- suma_uno * 2
promedio <- mean(multiplicado_por_dos)
Utilizando el operador tubería, la sintaxis de esta operación se puede simplificar:
lista_numeros <- c(5, 10, 15, 20)
promedio <- lista_numeros %>% + 1 %>% * 2 %>% mean()
Del paquete dyplr
, las funciones más comunes son:
glimpse
: utilizado para explorar rápidamente una
tabla de datos
summarise
: genera tablas resumen. Reduce las
dimensiones de una tabla de datos
select
: extrae columnas de una tabla de
datos
filter
: extrae filas de una tabla de casos
arrange
: ordena filas de una tabla de datos por el
valor de una variable particular si es numérico, o por orden alfabético
si es un carácter
group_by
: crea grupos dentro de una tabla de datos.
las funciones del dplyr
manipulan cada grupo por separado y
luego combina los resultados
mutate
: genera una nueva variable
rename
: cambia el nombre de la variable
Otra función que se utiliza continuamente en el análisis de datos es:
- unique
: te permite extraer sólo los elementos únicos del
conjunto de datos, eliminando las repeticiones
Veamos en más detalle las funciones más comunes del paquete
dyplr
glimpse
Esta función se utiliza para explorar información de los datos como:
número de filas (que en este caso sería el número de observaciones o
datos de nuestra población), número de columnas y sus nombres (que en
este caso serían el número de variables y sus nombres), entre “<
>” encontrará el tipo de dato (dbl
para
double
, chr
para character
, entre
otros) y un breve listado de algunos de los primeros valores de los
datos. La función glimpse
se puede aplicar sobre
dat
mediante el operador tubería como se muestra a
continuación:
dat %>% glimpse()
summarise
La función summarise
permite resumir los datos de
acuerdo con criterios definidos por funciones que retornan valores que
pueden ser de interés. Por ejemplo, para calcular la media de edad y el
conteo total de casos:
dat %>% summarise(media = mean(edad), numero = n())
select
La función select
es útil en caso de querer extraer una
o varias columnas de un Data.frame. Por ejemplo, se puede extraer la
variable edad
de dat
mediante el siguiente
comando:
dat %>% select(edad) #empleando el nombre de la columna
dat %>% select(c(1,2)) #o su ubicación en los datos
filter
Otra función de gran utilidad es filter
. Esta se puede
usar para seleccionar filas de acuerdo con una o más condiciones
lógicas. Por ejemplo, para filtrar los pacientes menores de 28 años:
dat %>% filter(edad < 28)
Como puede observar, el resultado contiene todas las variables de la tabla, pero los datos se limitan a aquellos que en edad sean menores de 28 años.
Ahora, filtre por los pacientes de 28 años o menos de sexo femenino. En este caso, al pedir que se incluyan adicionalmente los de 28 años también ya no se emplea unicamente el signo “<” sino que se lo acompaña del símbolo “=”:
dat %>% glimpse() #Observe como están expresadas las variables también puede usar la función `table()`
dat %>% filter(sexo == "F", edad <= 28) #Ahora sabe como filtrar el sexo
arrange
Para los casos donde se necesita organizar los datos por una o más
variables, se puede emplear la función arrange
. Por
ejemplo, para organizaros datos por edad, o por edad y sexo:
dat %>% arrange(edad)
dat %>% arrange(edad,sexo)
Por configuración predeterminada la función organiza los valores de
menor a mayor, en caso de querer organizarlos de mayor a menor se puede
emplear desc
al interior de la función
arrange
.
dat %>% arrange(desc(edad))
group_by
La función group_by
no tiene un uso evidente si es
empleada sola, dado que ocurre un proceso interno de agrupación de los
datos. Pero al ser usada con otras funciones como por ejemplo
summarise
es posible ver su efecto. Por ejemplo, el
siguiente comando agrupa los datos por sexo y calcula, para cada grupo,
el conteo de casos y su correspondiente media de edad:
dat %>%
group_by(sexo) %>%
summarise(numero = n(), media_edad = mean(edad))
mutate
Para crear una nueva columna con datos de una ya existente resulta de
utilidad la función mutate
. Esta función requiere el nombre
de la columna a crear y de la columna de la que queremos copiar los
datos. La columna nueva por configuración predeterminada se ubicará al
final de las variables. # TODO corregir ejemplo de mutate
dat %>% mutate(fecha_inicio_sintomas = fecha_de_inicio_de_sintomas)
rename
En caso de que no se desee crear una nueva variable sino renombrar
una ya existente, conviene usar la función rename
. Por
ejemplo, cambie el nombre nombre_departamento por el nombre
departamento.
dat %>% rename( departamento = nombre_departamento)
slice
Ya se vio previamente cómo seleccionar columnas por medio de la
función select
. En caso de requerir seleccionar filas
específicas de un Data.frame, la función slice
resulta de
gran utilidad. Por ejemplo, para seleccionar de la fila 10 a la 15:
dat %>% slice(10:15)
Alternativamente, en caso de que no se quiera emplear tidyverse, esta acción podría realizarse mediante el siguiente comando:
dat[10:15, ]
Sin embargo, usar tidyverse y sus funciones resulta de gran utilidad. Por ejemplo, suponga que necesita obtener los primeros 5 sujetos de la base que tengan edades entre 13 y 14 años por cada sexo. Usando tidyverse, la solución de este problema se vería así:
dat %>%
group_by(sexo) %>%
filter(edad >= 13, edad <=14) %>%
slice(1:5)
En caso de uno usar el operador tubería (pipe), el comando anterior se vería así:
slice(filter(group_by(dat, sexo),edad >= 13, edad <=14),1:5)
Como puede notar, el resultado es idéntico. Sin embargo, es preferible usar el operador tubería cuando se aplican varias funciones sucesivamente sobre un objeto porque simplifica la sintaxis del código y, como se puede ver, la lectura del mismo se hace más sencilla. Además, emplear el operador tubería facilita la modificación del proceso en caso de ser necesario.
Esta vez se cargará un tipo diferente de datos, estos los puede encontrar en el enlace https://github.com/TRACE-LAC/TRACE-LAC-data/blob/main/datos_covid.RDS?raw=true. Los datos pueden ser cargados desde el computador o desde una ubicación en internet. Para este ejercicio cargue la base de datos datos_covid.RDS directamente desde internet con los comandos:
url <- "https://github.com/TRACE-LAC/TRACE-LAC-data/blob/main/datos_covid.RDS?raw=true"
covid <- readr::read_rds(url)
Por favor, realice las siguientes actividades:
Como puede observar los nombres de las columnas (variables) están con
algunas letras en mayúsculas, otras con tildes y con espacios. Lo
primero que es necesario hacer es poner los nombres en una forma que
permitan evitar errores, es decir, todos en minúsculas, sin caracteres
especiales, tildes ni espacios. Para ello se usará la función
clean_labels
del paquete epitrix
.
#Primero se llamarán los nombres de las variables con la función `names`
names(covid)
#ahora a estos nombres se les reasignará nombres limpios
names(covid) <- names(covid) %>% epitrix::clean_labels()
names(covid)
Ahora que los nombres están limpios es posible seguir.
Contribuciones son bienvenidas vía pull requests.
Licencia: CC-BY Copyright: Zulma M. Cucunuba, 2019