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:
En la lado superior derecho, hacer click en Project -> New Project
Seleccionar “New Directory”
Seleccionar “New Project”
Asignar un nombre al proyecto y seleccionar la ubicación donde se guardará
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.
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
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).
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
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:
La columna Repetido NO puede incluir a los que repetidos. Los que no son repetidos son NA, por eso usamos is.na()
La columna observacion debe ser igual a “Cepa”
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
Veremos un ejemplo con la siguiente base ficticia:
Contempla varios problemas comunes en bases de datos:
Nombres de variables no estandarizados
Filas duplicadas (Juana)
Nombres con tildes y mayúsculas/minúsculas inconsistentes
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