Interfaz y proyectos

La interfaz de R cuenta con 4 paneles

A. Script o editor de código: Aquí es donde escribes y editas tu código R.

B. Consola: Aquí es donde se ejecuta el código y se muestran los resultados.

C. Entorno/Historial: Aquí puedes ver las variables y datos que has cargado

D. Archivos/Gráficos/Paquetes/Ayuda: Aquí puedes gestionar archivos, ver gráficos, manejar paquetes y acceder a la ayuda.

Es recomendable crear proyectos en RStudio para organizar mejor tu trabajo. Un proyecto en RStudio es una carpeta que contiene todos los archivos relacionados con un análisis específico, incluyendo scripts, datos y resultados.

El flujo para crear un proyecto es el siguiente:

  1. En la lado superior derecho, hacer click en Project -> New Project

  2. Seleccionar “New Directory”

  3. Seleccionar “New Project”

  4. Asignar un nombre al proyecto y seleccionar la ubicación donde se guardará

Librerias

Los paquetes en R son colecciones de funciones, datos y código organizado que extienden las capacidades básicas del lenguaje.

Para utilizar un paquete, es necesario:

Instalación: Se realiza una sola vez mediante el comando install.packages(“nombre_del_paquete”). Es obligatorio el uso de comillas.

Carga: Se debe ejecutar en cada nueva sesión de R usando library(nombre_del_paquete). En este caso, las comillas son opcionales.

install.packages("tidyverse")
library(tidyverse)

Para el desarrollo de este curso se utilizarán los siguientes paquetes:

  • tidyverse: Conjunto de paquetes para manipulación y visualización de datos.

  • readxl: Para leer archivos de Excel.

  • openxlsx: Para guardos archivos de Excel.

  • janitor: Para limpieza de datos.

  • stringi: Para manipulación de cadenas de texto.

Importación de datos desde Excel

Para importar datos desde excel, seguir la ruta: Import Dataset -> From Excel

Desde aquí se abrirá la siguiente ventana:

Primero hay que buscar el archivo. Tras seleccionarlo asignar un nombre en name y la hoja de excel que se desea importar en sheet.

Luego es necesario especificar que las fechas son formato date. Si se salta este paso las fechas se importaran en formato numerico.

Es recomendable copiar el código que aparece en la ventana para luego pegarlo dentro del script. En caso de que sea necesario volver a cargar la base de datos, basta con volver a ejecutarlo dentro del script, ya que incluye la ruta y tipo de datos.

Para importar presionar Import

Conceptos básicos

Pipe ( %>% ): Conector de acciones El pipe, representado por %>% (atajo: Ctrl + Shift + M), sirve para encadenar pasos. Léalo como un “entonces”. Permite pasar el resultado de una operación directamente a la siguiente sin necesidad de crear archivos intermedios.

Asignación ( <- ): Guardar cambios En R, para crear o actualizar un objeto (el equivalente a un archivo o tabla), usamos <-.

  • Sobrescribir: Si asignas el resultado al mismo nombre, los datos originales se pierden. Base <- Base %>% filtro

  • Crear nuevo: Para mantener la versión original y generar una nueva con cambios. Base_final <- Base_original %>% filtro

Los objetos creados y bases guardadas quedaran en el Enviroment, si seleccionamos una base podremos visualizarla en una ventana aparte.

Consulta vs. Modificación Solo ver: Si quieres visualizar un análisis o tabla en la consola sin guardarlo, no uses la flecha. Base %>% resumen

Guardar: Si necesitas que el resultado esté disponible más tarde en tu entorno de trabajo, debes usar la asignación. Resultado <- Base %>% resumen

Ejecución de código Para procesar tus instrucciones, sitúa el cursor sobre la línea y utiliza:

Atajo: Ctrl + Enter

Botón: Clic en Run (esquina superior derecha del editor).

Limpieza de datos

Un paso imprescindible es la limpieza y estandarización de la base de datos

Con la función clean_names podemos dejar los nombres de las variables estandarizados

Neumonia <- clean_names(Neumonia) 

Si queremos utilizar un subconjunto de datos, con caracteristicas especificas, usamos la función filter. Es similar a los filtros de Excel.

Por ejemplo, si queremos quedarnos solo con los datos de cepas de ciertos años:

Neumonia_20_24 <- Neumonia %>% #con <- creamos un nuevo objeto
  filter(ano_obt_corregido %in% c(2020, 2021,2022,2023, 2024)) #filtramos 

Guardamos la base en un nuevo objeto llamado Neumonia_20_24. De esta manera preservamos dentro de nuestro entorno la original y la modificada.

Con table podemos saber cuántos registros hay por cada año en la base filtrada:

table(Neumonia_20_24$ano_obt_corregido)
## 
## 2020 2021 2022 2023 2024 
##  287  403  690  958 1071

La estructura de table siempre es table(base$variable). Es recomentable revisar con table todas las variables que vayamos a utilizar en los análisis para asegurarnos que están correctas.

Por ejemplo, esta base tiene un problema típico: El sexo no está estandarizado

table(Neumonia_20_24$sexo) #vemos los valores que tiene la variable sexo
## 
##      F Hombre      M  Mujer 
##    480   1356    591    982

Para crear o modificar una columna en r utilizamos la función mutate. En este caso necesitamos modificar la columa sexo

#OPCION 1
#En la opcion 1 corregimos los que están mal. SI o SI debemos poner el TRUE ~ sexo al final, o  perderemos los que ya existen
Neumonia_20_24 <- Neumonia_20_24 %>% 
  mutate(sexo = str_trim(sexo),  #Eliminar espacios (En este caso no es necesario, pero sirve de ejemplo)
    sexo = case_when(
      sexo == "F" ~ "Mujer",
      sexo == "M" ~ "Hombre",
      TRUE ~ sexo #Para conservar los que ya existen
    ))

#OPCION 2
#En la opción 2 especificamos explicitamente todas las variables que quedarán como hombre, y todas las que quedaran como mujer. En este caso no es necesario el TRUE
Neumonia_20_24 <- Neumonia_20_24 %>% 
  mutate(sexo = case_when(
    sexo %in% c("Hombre", "M") ~ "Hombre",
      sexo %in% c("Mujer", "F") ~ "Mujer"))

#Revisemos
table(Neumonia_20_24$sexo) #vemos los valores que tiene la variable sexo
## 
## Hombre  Mujer 
##   1947   1462

Detección y manejo de duplicados

Para detectar duplicados crearemos una columna llamada Repetidos Esta detecta los duplicados (considerando 30 días de diferencia), y marca uno como “Repetido”. Ya que tenemos variables clave (las asociadas a los resultados), el codigo detecta si alguno de los duplicados no las tiene. En ese caso se marca como “Repetida” la fila incompleta. Si no, se marca la última.

Recordemos que para crear o modificar una columna en r utilizamos la función mutate

Neumonia_20_24 <- Neumonia_20_24 %>%
  mutate(
    n_completos = rowSums(!is.na(pick(
      clinda, clinda_int, rifamp, rifamp_int, meropenem, 
      merop_int, tetra, tetra_int, ceftarolina, cefta_int
    ))) #Cuenta la cantidad de columnas completas (para poder priorizar)
  ) %>%
  arrange(concatnom_std, desc(n_completos), desc(fecha_obtencion)) %>%
  group_by(concatnom_std) %>% #agrupa por nombre
  mutate(
    dif_dias = as.numeric(difftime(first(fecha_obtencion), fecha_obtencion, units = "days")),  #calcula diferencia de dias
    Repetido = if_else(row_number() > 1 & abs(dif_dias) <= 30, "Repetido", NA_character_) #marca como repetido a los duplicados dentro de 30 días
  ) %>%
  ungroup() %>%
  select(-n_completos, -dif_dias)

Si queremos podemos ver cuantos quedaron marcados como repetidos (O quienes si no ponemos el count)

Neumonia_20_24 %>% #seleccionamos la base (Ojo: solo seleccionamos, no modificamos)
  filter(Repetido == "Repetido") %>% #Filtramos dejando los repetidos
  count() #contar 
## # A tibble: 1 × 1
##       n
##   <int>
## 1     3

En total hay 3 repetidos.

Ahora filtraremos a Repetidos y filas que no son Cepas

Neumonia_20_24 <- Neumonia_20_24 %>% #modificaremos la base
  filter(is.na(Repetido), observacion == "Cepa") #filtramos

El filter puede incluir más de una condición, en este caso estamos especificando que:

  1. La columna Repetido NO puede incluir a los que repetidos. Los que no son repetidos son NA, por eso usamos is.na()

  2. La columna observacion debe ser igual a “Cepa”

Tablas

Replicaremos la primera tabla del boletín: Resistencia in vitro a penicilina y cefotaxima en cepas de Streptococcus pneumoniae.

Para esto sacaremos los n y % para cada antibiotico

Para Penicilina:

 Neumonia_20_24 %>% #seleccionamos base
  filter(!is.na(peni_int), peni_int != "Revisar") %>% #filtramos
  group_by(ano_obt_corregido, meningitis, peni_int) %>% #agrupamos en orden
  summarise(n =n())  %>% #obtenemos el total
  mutate(total = sum(n) ,pct = round(n/total*100, 1)) #obtenemos los porcentajes
## # A tibble: 19 × 6
## # Groups:   ano_obt_corregido, meningitis [10]
##    ano_obt_corregido meningitis    peni_int     n total   pct
##                <dbl> <chr>         <chr>    <int> <int> <dbl>
##  1              2020 Meningitis    R           10    24  41.7
##  2              2020 Meningitis    S           14    24  58.3
##  3              2020 No meningitis I            3   252   1.2
##  4              2020 No meningitis S          249   252  98.8
##  5              2021 Meningitis    R            3    25  12  
##  6              2021 Meningitis    S           22    25  88  
##  7              2021 No meningitis I            1   370   0.3
##  8              2021 No meningitis S          369   370  99.7
##  9              2022 Meningitis    R           27    67  40.3
## 10              2022 Meningitis    S           40    67  59.7
## 11              2022 No meningitis S          604   604 100  
## 12              2023 Meningitis    R           46   106  43.4
## 13              2023 Meningitis    S           60   106  56.6
## 14              2023 No Meningitis I            2   829   0.2
## 15              2023 No Meningitis R            1   829   0.1
## 16              2023 No Meningitis S          826   829  99.6
## 17              2024 Meningitis    R           38    99  38.4
## 18              2024 Meningitis    S           61    99  61.6
## 19              2024 No Meningitis S          955   955 100

Luego para cefotaxima solo necesitamos cambiar ‘peni’ por ‘cefo’. Para hacer reemplazos de palabras podemos usar crtl + F. Es importante seleccionar el trozo de código en el que queremos hacer el reemplazo, o se hará en todo el script.

Neumonia_20_24 %>% filter(!is.na(cefo_int), cefo_int != "Revisar") %>% group_by(ano_obt_corregido, meningitis, cefo_int) %>% summarise(n =n())  %>% mutate(total = sum(n) ,pct = round(n/total*100, 1))
## # A tibble: 18 × 6
## # Groups:   ano_obt_corregido, meningitis [10]
##    ano_obt_corregido meningitis    cefo_int     n total   pct
##                <dbl> <chr>         <chr>    <int> <int> <dbl>
##  1              2020 Meningitis    I            1    24   4.2
##  2              2020 Meningitis    R            1    24   4.2
##  3              2020 Meningitis    S           22    24  91.7
##  4              2020 No meningitis I            3   252   1.2
##  5              2020 No meningitis S          249   252  98.8
##  6              2021 Meningitis    I            1    25   4  
##  7              2021 Meningitis    S           24    25  96  
##  8              2021 No meningitis I            1   370   0.3
##  9              2021 No meningitis S          369   370  99.7
## 10              2022 Meningitis    I            4    67   6  
## 11              2022 Meningitis    R            1    67   1.5
## 12              2022 Meningitis    S           62    67  92.5
## 13              2022 No meningitis S          604   604 100  
## 14              2023 Meningitis    I            5   106   4.7
## 15              2023 Meningitis    S          101   106  95.3
## 16              2023 No Meningitis S          829   829 100  
## 17              2024 Meningitis    S           99    99 100  
## 18              2024 No Meningitis S          955   955 100

Si queremos descargar la base de datos en un archivo excel es necesario guardar el output en un objeto

tabla1_cefo <- Neumonia_20_24 %>% filter(!is.na(cefo_int), cefo_int != "Revisar") %>% group_by(ano_obt_corregido, meningitis, cefo_int) %>% summarise(n =n())  %>% mutate(total = sum(n) ,pct = round(n/total*100, 1))

write.xlsx(tabla1_cefo, "cefo_tabla1.xlsx") #Guardamos

Ejemplo adicional

Veremos un ejemplo con la siguiente base ficticia: Contempla varios problemas comunes en bases de datos:

  1. Nombres de variables no estandarizados

  2. Filas duplicadas (Juana)

  3. Nombres con tildes y mayúsculas/minúsculas inconsistentes

  4. Necesidad de crear variables nuevas (concatenar nombres, rango etario)

Primero limpiaremos los nombres y variables. Si no hacemos esto, r no detectaria el duplicado de Juana, ya que tiene una Metropolitana en mayúscula y otra en minúscula.

Base_ficticia <- clean_names(Base_ficticia) #limpiamos nombres de variables

#Quitar tildes y dejar primera letra en mayuscula, segunda en minuscula
Base_ficticia <- Base_ficticia %>%
  mutate(region = str_to_title(stri_trans_general(region, "Latin-ASCII")))

Luego eliminaremos los duplicados

Base_ficticia <- clean_names(Base_ficticia) #limpiamos nombres de variables
Base_ficticia <- distinct(Base_ficticia) #eliminamos duplicado

La función distinct() elimina filas duplicadas exactas en todas las columnas. Considera aquellas en que todos los campos son iguales.

Finalmente crearemos la columna de nombres concatenados y rango etario:

#Concatenar nombres
Base_ficticia <- Base_ficticia %>% #seleccionamos y modificamos
  mutate(Nombre_concat = paste(nombre, #seleccionamos elementos a concatenar
                               apellido_paterno,
                               apellido_materno, sep = " ")) #separacion un espacio

# Crear rango etario
Base_ficticia <- Base_ficticia %>% 
  mutate(rango_etario = case_when(
    edad < 18 ~ "<18",
    edad >= 18 & edad <= 40 ~ "18-40",
    edad > 40 ~ ">40"
  ))

Base_ficticia %>% select(region, Nombre_concat, rango_etario)
## # A tibble: 3 × 3
##   region               Nombre_concat         rango_etario
##   <chr>                <chr>                 <chr>       
## 1 Region Metropolitana Juan Perez Rodriguez  <18         
## 2 Region Metropolitana Juana Rodriguez Perez >40         
## 3 Region Metropolitana Rodrigo Perez Juanez  18-40