Semana 2: Fundamentos de R – Tipos de datos y operaciones básicas

Construyendo las bases para el análisis de datos en salud

Author

Agoralab

Published

Invalid Date

Fundamentos de R – Tipos de datos y operaciones básicas

Bienvenida y repaso

En la sesión anterior, nos familiarizamos con R, RStudio y Quarto. Hoy profundizaremos en los fundamentos del lenguaje R y aprenderemos sobre los diferentes tipos de datos y estructuras que utilizaremos constantemente en nuestros análisis de datos en ciencias de la salud.

Objetivos de la sesión

Al finalizar esta sesión, serás capaz de:

  1. Comprender la sintaxis básica de R y el uso de la consola
  2. Identificar y trabajar con los diferentes tipos de datos en R
  3. Crear y manipular las estructuras fundamentales (vectores, matrices, data frames, listas)
  4. Realizar operaciones básicas con datos en R
  5. Utilizar la indexación para seleccionar elementos específicos
  6. Manejar valores faltantes (NA) de forma adecuada

Conceptos básicos del lenguaje R

Sintaxis de R

R tiene una sintaxis particular que es importante comprender:

Code
# Comentarios: cualquier texto después de # es ignorado por R
# Esto es útil para documentar tu código

# Asignación de valores a variables
# En R, usamos principalmente <- para asignar valores (aunque = también funciona)
x <- 10  # asigna el valor 10 a la variable x
y = 20   # hace lo mismo, pero <- es más común en R

# Mostrar el valor de una variable
x
[1] 10
Code
y
[1] 20
Code
# Funciones: nombre seguido de paréntesis con argumentos
# Las funciones realizan operaciones y devuelven resultados
sqrt(25)  # raíz cuadrada
[1] 5
Code
log(10)   # logaritmo natural
[1] 2.302585
Buenas prácticas de nomenclatura en R

En R, la convención para nombrar variables es usar nombres descriptivos con palabras separadas por guiones bajos (snake_case) o puntos. Por ejemplo: edad_paciente o edad.paciente.

Algunos consejos adicionales: - Usa nombres descriptivos (prefiere edad_promedio sobre e_p) - Evita usar nombres de funciones existentes (c, mean, data, etc.) - Mantén consistencia en tu estilo de nomenclatura a lo largo de todo tu código - Los nombres deben comenzar con una letra, no con números o símbolos

Operadores básicos

R incluye varios operadores para realizar operaciones:

Code
# Operadores aritméticos
5 + 3    # suma
[1] 8
Code
10 - 4   # resta
[1] 6
Code
6 * 7    # multiplicación
[1] 42
Code
9 / 3    # división
[1] 3
Code
2^3      # potencia (2 elevado al cubo)
[1] 8
Code
10 %% 3  # módulo (resto de la división: 10/3 = 3 con resto 1)
[1] 1
Code
10 %/% 3 # división entera (parte entera: 10/3 = 3)
[1] 3
Code
# Operadores de comparación
5 > 3    # mayor que
[1] TRUE
Code
7 < 2    # menor que
[1] FALSE
Code
4 >= 4   # mayor o igual que
[1] TRUE
Code
8 <= 10  # menor o igual que
[1] TRUE
Code
5 == 5   # igual a
[1] TRUE
Code
6 != 8   # diferente de
[1] TRUE
Code
# Operadores lógicos
TRUE & FALSE   # AND lógico (ambos deben ser TRUE)
[1] FALSE
Code
TRUE | FALSE   # OR lógico (al menos uno debe ser TRUE)
[1] TRUE
Code
!TRUE          # NOT lógico (invierte el valor)
[1] FALSE
Aplicación práctica en investigación sanitaria

Los operadores de comparación y lógicos son fundamentales en la investigación sanitaria para:

  • Filtrar pacientes según criterios de inclusión/exclusión (ej. edad >= 18 & !fumador)
  • Identificar valores anómalos (ej. presion_sistolica > 180 | presion_sistolica < 90)
  • Categorizar pacientes según criterios clínicos (ej. if(imc >= 30) "Obesidad" else "No obesidad")
  • Validar datos (ej. all(glucosa > 0) para verificar que no hay valores negativos)

Tipos de datos en R

R tiene varios tipos de datos básicos que debes conocer:

Tipos atómicos de datos

Code
# 1. Numeric (double): números decimales
peso <- 65.5
class(peso)
[1] "numeric"
Code
typeof(peso)
[1] "double"
Code
# 2. Integer: números enteros (se indican con L)
edad <- 35L  # La L indica que es un entero
class(edad)
[1] "integer"
Code
typeof(edad)
[1] "integer"
Code
# 3. Character: texto (cadenas de caracteres)
nombre <- "Paciente A"
diagnostico <- 'Hipertensión'  # Tanto comillas simples como dobles funcionan
class(nombre)
[1] "character"
Code
typeof(nombre)
[1] "character"
Code
# 4. Logical: valores TRUE o FALSE (booleanos)
tiene_diabetes <- TRUE
es_fumador <- FALSE
class(tiene_diabetes)
[1] "logical"
Code
typeof(tiene_diabetes)
[1] "logical"
Code
# 5. Complex: números complejos (menos usado en análisis de datos de salud)
num_complejo <- 3 + 2i
class(num_complejo)
[1] "complex"
Code
typeof(num_complejo)
[1] "complex"
Cosas a tener en cuenta sobre los tipos de datos
  1. Coerción automática: R a veces convierte automáticamente entre tipos de datos. Por ejemplo, si combinas números y caracteres en un vector, todos los elementos se convertirán a caracteres.

    c(1, 2, "tres")  # Resultado: "1" "2" "tres"
  2. Precisión numérica: R tiene limitaciones en la precisión decimal. Para cálculos financieros o que requieren precisión exacta, considera paquetes especializados.

  3. NA vs NULL: NA representa datos faltantes y tiene un tipo (NA_real_, NA_character_, etc.), mientras que NULL representa la ausencia de un valor y no tiene tipo.

Tipo especial: Factor

Los factores son fundamentales en investigación en salud para representar variables categóricas (como sexo, grupo de tratamiento, estadios de enfermedad):

Code
# Crear un factor (variable categórica)
sexo <- factor(c("M", "F", "F", "M", "F", "M"))
sexo
[1] M F F M F M
Levels: F M
Code
# Ver los niveles del factor
levels(sexo)
[1] "F" "M"
Code
# Factores ordenados (útil para variables como severidad)
severidad <- factor(
  c("Leve", "Moderado", "Severo", "Moderado", "Leve"),
  levels = c("Leve", "Moderado", "Severo"),
  ordered = TRUE
)
severidad
[1] Leve     Moderado Severo   Moderado Leve    
Levels: Leve < Moderado < Severo
Code
# Comprobar si los valores son ordenados
is.ordered(severidad)
[1] TRUE
Code
# Comparaciones con factores ordenados
severidad[1] < severidad[3]  # ¿Es "Leve" menos severo que "Severo"?
[1] TRUE
¿Por qué son importantes los factores en estudios clínicos?

Los factores en R son cruciales para el análisis estadístico en investigación médica porque:

  1. Preservan el orden significativo: En variables como “leve/moderado/severo”, el orden importa y los factores ordenados lo mantienen.

  2. Control en modelos estadísticos: R trata automáticamente los factores de manera adecuada en regresiones y ANOVA, creando las variables dummy necesarias.

  3. Referencia explícita: Puedes controlar cuál nivel sirve como referencia en modelos estadísticos (relevel()), lo que afecta la interpretación de coeficientes.

  4. Eficiencia computacional: Internamente, los factores se almacenan como enteros con una tabla de búsqueda, ahorrando memoria para conjuntos de datos grandes.

Estructuras de datos en R

Las estructuras de datos permiten organizar y manipular conjuntos de información. Estas son las principales:

Vectores

Los vectores son la estructura más básica en R - una colección de elementos del mismo tipo:

Code
# Crear vectores con c() - concatenar valores
edades <- c(25, 42, 37, 29, 51)
pacientes <- c("Juan", "María", "Carlos", "Ana", "Pedro")
hipertension <- c(TRUE, FALSE, TRUE, FALSE, TRUE)

# Longitud de un vector
length(edades)
[1] 5
Code
# Operaciones con vectores (se aplican elemento a elemento)
edades + 5  # Suma 5 a cada edad
[1] 30 47 42 34 56
Code
edades * 2  # Multiplica por 2 cada edad
[1]  50  84  74  58 102
Code
# Dos vectores de igual longitud
peso <- c(70, 65, 82, 58, 75)
altura <- c(1.75, 1.62, 1.80, 1.58, 1.70)

# Operación entre vectores
imc <- peso / (altura^2)
imc
[1] 22.85714 24.76757 25.30864 23.23346 25.95156
Code
# Nombrar elementos de un vector
names(imc) <- pacientes
imc
    Juan    María   Carlos      Ana    Pedro 
22.85714 24.76757 25.30864 23.23346 25.95156 
Vectorización: La clave de la eficiencia en R

Una característica poderosa de R es la vectorización: las operaciones se aplican a todos los elementos de un vector sin necesidad de bucles explícitos. Esto hace que el código sea:

  • Más conciso y legible
  • Significativamente más rápido
  • Menos propenso a errores

Ejemplo: Calcular el IMC para 100 pacientes

# Forma vectorizada (rápida y concisa)
imc <- peso / (altura^2)

# Equivalente con bucle (lenta y verbosa)
imc_bucle <- numeric(length(peso))
for (i in 1:length(peso)) {
  imc_bucle[i] <- peso[i] / (altura[i]^2)
}

Siempre que sea posible, aprovecha la vectorización en R para obtener código más eficiente.

Matrices

Las matrices son arreglos bidimensionales (filas y columnas) que contienen datos del mismo tipo:

Code
# Crear una matriz
matriz_datos <- matrix(
  c(120, 130, 125, 140, 115,  # Presión sistólica
    80, 85, 82, 95, 75),      # Presión diastólica
  nrow = 5,   # 5 filas (pacientes)
  ncol = 2,   # 2 columnas (sistólica y diastólica)
  byrow = TRUE  # Llenar por filas
)

matriz_datos
     [,1] [,2]
[1,]  120  130
[2,]  125  140
[3,]  115   80
[4,]   85   82
[5,]   95   75
Code
# Asignar nombres a filas y columnas
rownames(matriz_datos) <- c("Paciente 1", "Paciente 2", "Paciente 3", 
                            "Paciente 4", "Paciente 5")
colnames(matriz_datos) <- c("Sistólica", "Diastólica")
matriz_datos
           Sistólica Diastólica
Paciente 1       120        130
Paciente 2       125        140
Paciente 3       115         80
Paciente 4        85         82
Paciente 5        95         75
Code
# Dimensiones de la matriz
dim(matriz_datos)
[1] 5 2
Code
# Operaciones básicas con matrices
matriz_datos + 5  # Sumar 5 a cada elemento
           Sistólica Diastólica
Paciente 1       125        135
Paciente 2       130        145
Paciente 3       120         85
Paciente 4        90         87
Paciente 5       100         80
Code
matriz_datos * 0.9  # Multiplicar cada elemento por 0.9
           Sistólica Diastólica
Paciente 1     108.0      117.0
Paciente 2     112.5      126.0
Paciente 3     103.5       72.0
Paciente 4      76.5       73.8
Paciente 5      85.5       67.5

Data frames

Los data frames son las estructuras más utilizadas para datos tabulares en análisis de datos en salud. A diferencia de las matrices, pueden contener diferentes tipos de datos en cada columna:

Code
# Crear un data frame
pacientes_df <- data.frame(
  nombre = c("Juan", "María", "Carlos", "Ana", "Pedro"),
  edad = c(25, 42, 37, 29, 51),
  peso = c(70, 65, 82, 58, 75),
  altura = c(1.75, 1.62, 1.80, 1.58, 1.70),
  hipertension = c(TRUE, FALSE, TRUE, FALSE, TRUE)
)

# Ver el data frame
pacientes_df
Code
# Estructura del data frame
str(pacientes_df)
'data.frame':   5 obs. of  5 variables:
 $ nombre      : chr  "Juan" "María" "Carlos" "Ana" ...
 $ edad        : num  25 42 37 29 51
 $ peso        : num  70 65 82 58 75
 $ altura      : num  1.75 1.62 1.8 1.58 1.7
 $ hipertension: logi  TRUE FALSE TRUE FALSE TRUE
Code
# Resumen estadístico básico
summary(pacientes_df)
    nombre               edad           peso        altura     hipertension   
 Length:5           Min.   :25.0   Min.   :58   Min.   :1.58   Mode :logical  
 Class :character   1st Qu.:29.0   1st Qu.:65   1st Qu.:1.62   FALSE:2        
 Mode  :character   Median :37.0   Median :70   Median :1.70   TRUE :3        
                    Mean   :36.8   Mean   :70   Mean   :1.69                  
                    3rd Qu.:42.0   3rd Qu.:75   3rd Qu.:1.75                  
                    Max.   :51.0   Max.   :82   Max.   :1.80                  
Code
# Acceder a una columna con $
pacientes_df$edad
[1] 25 42 37 29 51
Code
# Crear una nueva columna (IMC)
pacientes_df$imc <- pacientes_df$peso / (pacientes_df$altura^2)
pacientes_df
Code
# Número de filas y columnas
nrow(pacientes_df)
[1] 5
Code
ncol(pacientes_df)
[1] 6
Code
dim(pacientes_df)
[1] 5 6

Los data frames son fundamentales en análisis de datos epidemiológicos y clínicos, ya que permiten estructurar información de pacientes o casos de manera ordenada, con cada fila representando un individuo y cada columna una variable.

Listas

Las listas son estructuras más flexibles que pueden contener elementos de diferentes tipos, incluso otras listas o data frames:

Code
# Crear una lista
paciente_info <- list(
  nombre = "Juan Pérez",
  edad = 45,
  mediciones = c(120, 118, 122),  # Vector de presiones sistólicas
  labs = data.frame(
    parametro = c("Glucosa", "Colesterol", "Triglicéridos"),
    valor = c(95, 210, 180),
    unidad = c("mg/dL", "mg/dL", "mg/dL")
  ),
  fumador = FALSE
)

# Ver la lista
paciente_info
$nombre
[1] "Juan Pérez"

$edad
[1] 45

$mediciones
[1] 120 118 122

$labs
      parametro valor unidad
1       Glucosa    95  mg/dL
2    Colesterol   210  mg/dL
3 Triglicéridos   180  mg/dL

$fumador
[1] FALSE
Code
# Acceder a un elemento de la lista
paciente_info$nombre
[1] "Juan Pérez"
Code
paciente_info$mediciones
[1] 120 118 122
Code
# Otra forma de acceder a elementos
paciente_info[[1]]  # Primer elemento (nombre)
[1] "Juan Pérez"
Code
paciente_info[[3]]  # Tercer elemento (mediciones)
[1] 120 118 122
Code
# Acceder a un data frame dentro de la lista
paciente_info$labs
Code
# Acceder a un elemento específico dentro del data frame en la lista
paciente_info$labs$valor[2]  # Valor de colesterol
[1] 210

Las listas son útiles para almacenar resultados de análisis complejos, información heterogénea de pacientes o para agrupar varios objetos relacionados.

Indexación y selección de elementos

La indexación es crucial para extraer y manipular datos específicos. Hay varias formas de seleccionar datos:

Indexación de vectores

Code
# Vector de ejemplo
presion_sistolica <- c(120, 135, 142, 118, 125, 131, 145)
nombres <- c("Juan", "María", "Carlos", "Ana", "Pedro", "Laura", "Sergio")
names(presion_sistolica) <- nombres

# Seleccionar un elemento por su posición
presion_sistolica[3]  # Tercer elemento
Carlos 
   142 
Code
# Seleccionar múltiples elementos
presion_sistolica[c(1, 3, 5)]  # Elementos 1, 3 y 5
  Juan Carlos  Pedro 
   120    142    125 
Code
# Seleccionar un rango
presion_sistolica[2:5]  # Del segundo al quinto elemento
 María Carlos    Ana  Pedro 
   135    142    118    125 
Code
# Seleccionar por nombre
presion_sistolica["Pedro"]
Pedro 
  125 
Code
# Excluir elementos (signos negativos)
presion_sistolica[-2]  # Todos excepto el segundo elemento
  Juan Carlos    Ana  Pedro  Laura Sergio 
   120    142    118    125    131    145 
Code
# Seleccionar con condiciones lógicas
presion_sistolica[presion_sistolica > 130]  # Valores mayores a 130
 María Carlos  Laura Sergio 
   135    142    131    145 

Indexación de matrices

Code
# Usando la matriz creada anteriormente
matriz_datos
           Sistólica Diastólica
Paciente 1       120        130
Paciente 2       125        140
Paciente 3       115         80
Paciente 4        85         82
Paciente 5        95         75
Code
# Seleccionar un elemento específico [fila, columna]
matriz_datos[3, 2]  # Fila 3, columna 2
[1] 80
Code
# Seleccionar una fila completa
matriz_datos[2, ]  # Segunda fila
 Sistólica Diastólica 
       125        140 
Code
# Seleccionar una columna completa
matriz_datos[, 1]  # Primera columna
Paciente 1 Paciente 2 Paciente 3 Paciente 4 Paciente 5 
       120        125        115         85         95 
Code
# Seleccionar múltiples filas y columnas
matriz_datos[c(1, 3, 5), ]  # Filas 1, 3 y 5
           Sistólica Diastólica
Paciente 1       120        130
Paciente 3       115         80
Paciente 5        95         75
Code
matriz_datos[, c(1, 2)]  # Ambas columnas (toda la matriz)
           Sistólica Diastólica
Paciente 1       120        130
Paciente 2       125        140
Paciente 3       115         80
Paciente 4        85         82
Paciente 5        95         75
Code
# Seleccionar por nombres
matriz_datos["Paciente 4", "Sistólica"]
[1] 85

Indexación de data frames

Code
# Usando el data frame creado anteriormente
pacientes_df
Code
# Seleccionar una columna con $
pacientes_df$edad
[1] 25 42 37 29 51
Code
# Seleccionar una fila
pacientes_df[3, ]  # Tercera fila
Code
# Seleccionar una celda específica
pacientes_df[2, 3]  # Fila 2, columna 3
[1] 65
Code
# Seleccionar múltiples columnas
pacientes_df[, c("nombre", "edad", "imc")]
Code
# Seleccionar con condiciones lógicas
pacientes_df[pacientes_df$edad > 35, ]  # Pacientes mayores de 35 años
Code
pacientes_df[pacientes_df$hipertension == TRUE, ]  # Pacientes con hipertensión
Tip

En análisis epidemiológicos, la selección por condiciones lógicas es extremadamente útil para filtrar casos por criterios específicos, como rangos de edad, presencia de factores de riesgo o valores límite de indicadores clínicos.

Manejo de valores ausentes (NA)

En datos de salud es muy común encontrar valores faltantes. R representa estos valores con NA (Not Available):

Code
# Vector con valores NA
glucosa <- c(95, 110, NA, 87, 122, NA, 105)

# Verificar si hay NA
is.na(glucosa)
[1] FALSE FALSE  TRUE FALSE FALSE  TRUE FALSE
Code
any(is.na(glucosa))  # ¿Hay algún NA?
[1] TRUE
Code
sum(is.na(glucosa))  # ¿Cuántos NA hay?
[1] 2
Code
# Calcular la media ignorando NA
mean(glucosa)  # Devuelve NA
[1] NA
Code
mean(glucosa, na.rm = TRUE)  # Ignora los NA
[1] 103.8
Code
# Eliminar valores NA
glucosa_completos <- na.omit(glucosa)
glucosa_completos
[1]  95 110  87 122 105
attr(,"na.action")
[1] 3 6
attr(,"class")
[1] "omit"
Code
# Reemplazar NA con un valor (por ejemplo, la media)
glucosa_reemplazo <- glucosa
glucosa_reemplazo[is.na(glucosa_reemplazo)] <- mean(glucosa, na.rm = TRUE)
glucosa_reemplazo
[1]  95.0 110.0 103.8  87.0 122.0 103.8 105.0
El manejo de valores faltantes puede afectar tus conclusiones

El método que elijas para manejar los NA puede tener un impacto significativo en tus resultados:

  1. Eliminar casos completos (na.omit()) puede:
    • Reducir drásticamente el tamaño de la muestra
    • Introducir sesgos si los datos no faltan completamente al azar
    • Afectar la representatividad de la muestra
  2. Imputación simple (reemplazar con la media, mediana, etc.) puede:
    • Subestimar la variabilidad real
    • Distorsionar las relaciones entre variables
    • Dar una falsa sensación de precisión
  3. Métodos avanzados como imputación múltiple o modelos específicos para datos faltantes suelen ser preferibles en investigación rigurosa.

Siempre documenta y justifica tu estrategia para manejar valores faltantes en cualquier análisis.

Ejercicio práctico: Análisis de datos de pacientes

Vamos a poner en práctica lo aprendido con un ejercicio sobre datos de pacientes:

Code
# Creamos un data frame con datos de pacientes hipotéticos
set.seed(123)  # Para reproducibilidad

datos_pacientes <- data.frame(
  id = 1:20,
  edad = sample(18:80, 20, replace = TRUE),
  sexo = factor(sample(c("M", "F"), 20, replace = TRUE)),
  peso = round(rnorm(20, mean = 70, sd = 15), 1),
  altura = round(rnorm(20, mean = 1.65, sd = 0.1), 2),
  grupo_sanguineo = factor(sample(c("A+", "A-", "B+", "B-", "AB+", "AB-", "O+", "O-"), 
                                 20, replace = TRUE)),
  presion_sistolica = sample(100:160, 20, replace = TRUE),
  presion_diastolica = sample(60:100, 20, replace = TRUE),
  glucosa = round(rnorm(20, mean = 100, sd = 20), 1),
  colesterol = round(rnorm(20, mean = 200, sd = 40), 1)
)

# Añadimos algunos NA para practicar
datos_pacientes$peso[c(3, 15)] <- NA
datos_pacientes$glucosa[c(7, 12, 18)] <- NA

# Exploramos los datos
datos_pacientes

Ahora, analicemos estos datos con lo aprendido:

Code
# 1. ¿Cuántos pacientes hay de cada sexo?
table(datos_pacientes$sexo)

 F  M 
 8 12 
Code
# 2. Calculamos el IMC para cada paciente
datos_pacientes$imc <- datos_pacientes$peso / (datos_pacientes$altura^2)
head(datos_pacientes)  # Mostramos las primeras filas
Code
# 3. ¿Cuántos pacientes tienen sobrepeso (IMC > 25)?
sum(datos_pacientes$imc > 25, na.rm = TRUE)
[1] 4
Code
# 4. Estadísticas básicas de presión arterial
summary(datos_pacientes[, c("presion_sistolica", "presion_diastolica")])
 presion_sistolica presion_diastolica
 Min.   :106.0     Min.   :64.00     
 1st Qu.:121.2     1st Qu.:69.50     
 Median :128.5     Median :81.50     
 Mean   :130.9     Mean   :80.35     
 3rd Qu.:145.0     3rd Qu.:91.00     
 Max.   :153.0     Max.   :98.00     
Code
# 5. Creamos una columna de categoría de presión
datos_pacientes$categoria_presion <- ifelse(
  datos_pacientes$presion_sistolica >= 140 | datos_pacientes$presion_diastolica >= 90,
  "Hipertensión",
  "Normal"
)
datos_pacientes$categoria_presion <- factor(datos_pacientes$categoria_presion)

# 6. ¿Cuántos pacientes tienen hipertensión?
table(datos_pacientes$categoria_presion)

Hipertensión       Normal 
          10           10 
Code
# 7. Seleccionamos los pacientes con hipertensión
pacientes_hipertension <- datos_pacientes[datos_pacientes$categoria_presion == "Hipertensión", ]
pacientes_hipertension
Code
# 8. Edad promedio de los pacientes con hipertensión
mean(pacientes_hipertension$edad)
[1] 45.1
Code
# 9. ¿Hay alguna relación entre sexo e hipertensión?
table(datos_pacientes$sexo, datos_pacientes$categoria_presion)
   
    Hipertensión Normal
  F            4      4
  M            6      6

Ejercicio para practicar

A continuación, se propone un pequeño conjunto de ejercicios para practicar lo aprendido. Intenta resolverlos por tu cuenta y luego compara con las soluciones:

  1. Crea un vector con los valores de glucosa y calcula la media, mediana y desviación estándar (ignorando los NA).
  2. Selecciona todos los pacientes mujeres (F) con colesterol superior a 200.
  3. Crea una nueva variable que clasifique el IMC en: “Bajo peso” (<18.5), “Normal” (18.5-24.9), “Sobrepeso” (25-29.9) y “Obesidad” (≥30).
  4. ¿Cuál es el grupo sanguíneo más común en tu dataset?
  5. Calcula la proporción de pacientes con glucosa superior a 126 mg/dL (un criterio para diabetes).
Estrategias para resolver problemas con R
  1. Divide y vencerás: Descompón problemas complejos en pasos más pequeños y resuelve cada uno por separado.

  2. Usa la ayuda de R: Si no recuerdas cómo funciona una función, usa ?nombre_funcion para ver la documentación.

  3. Comprueba tus resultados intermedios: Verifica los resultados de cada paso con head(), str() o summary() para detectar problemas temprano.

  4. Aprovecha la comunidad: Sitios como Stack Overflow tienen respuestas a casi cualquier pregunta sobre R que puedas tener.

Code
# Soluciones (descubre primero por tu cuenta)

# 1. Estadísticas de glucosa
glucosa_stats <- c(
  Media = mean(datos_pacientes$glucosa, na.rm = TRUE),
  Mediana = median(datos_pacientes$glucosa, na.rm = TRUE),
  Desv_estandar = sd(datos_pacientes$glucosa, na.rm = TRUE)
)
glucosa_stats
        Media       Mediana Desv_estandar 
     99.58824      95.30000      19.44209 
Code
# 2. Mujeres con colesterol > 200
mujeres_colesterol_alto <- datos_pacientes[datos_pacientes$sexo == "F" & 
                                          datos_pacientes$colesterol > 200, ]
mujeres_colesterol_alto
Code
# 3. Clasificación de IMC
datos_pacientes$categoria_imc <- cut(
  datos_pacientes$imc,
  breaks = c(0, 18.5, 24.9, 29.9, Inf),
  labels = c("Bajo peso", "Normal", "Sobrepeso", "Obesidad"),
  right = TRUE
)
table(datos_pacientes$categoria_imc, useNA = "ifany")

Bajo peso    Normal Sobrepeso  Obesidad      <NA> 
        3        11         2         2         2 
Code
# 4. Grupo sanguíneo más común
table(datos_pacientes$grupo_sanguineo)

 A- AB- AB+  B-  B+  O-  O+ 
  6   2   2   2   2   2   4 
Code
which.max(table(datos_pacientes$grupo_sanguineo))
A- 
 1 
Code
# 5. Proporción con glucosa > 126 mg/dL
prop_diabetes <- mean(datos_pacientes$glucosa > 126, na.rm = TRUE)
prop_diabetes
[1] 0.1176471
Code
cat("Proporción de pacientes con glucosa > 126 mg/dL:", prop_diabetes * 100, "%\n")
Proporción de pacientes con glucosa > 126 mg/dL: 11.76471 %

Recursos adicionales

Para profundizar en los temas vistos hoy:

Para la próxima sesión

En la próxima sesión aprenderemos sobre: - Importación de datos desde archivos CSV, Excel y otros formatos - Técnicas para explorar y limpiar datos - Manejo de problemas comunes en datos crudos - Introducción al concepto de datos “tidy”

Prepárate instalando los siguientes paquetes si aún no lo has hecho:

Code
install.packages(c("readr", "readxl", "janitor", "skimr"))

Conclusiones

En esta sesión hemos:

  • Comprendido la sintaxis básica de R
  • Aprendido sobre los diferentes tipos de datos (numéricos, caracteres, lógicos, factores)
  • Explorado las estructuras fundamentales (vectores, matrices, data frames, listas)
  • Practicado la indexación para seleccionar elementos específicos
  • Trabajado con valores NA
  • Aplicado estos conocimientos a un conjunto de datos de pacientes

Estos fundamentos son la base para todo análisis de datos en salud. En las próximas sesiones, construiremos sobre estos conocimientos para realizar análisis más complejos y relevantes para la investigación en ciencias de la salud.

¡Nos vemos en la próxima sesión!