Apéndice C — Apéndice C: Guía de R para Estadística Médica

Esta guía cubre los fundamentos de R orientados a la práctica de la bioestadística y la investigación médica: importación de datos clínicos, manejo de variables categóricas (exposición, enfermedad, grupo), descripción de cohortes, contraste de hipótesis y visualización. Complementa al Apéndice B (paquete BioEstatR) y al Apéndice A (repaso matemático).

TipCómo usar este apéndice

El material está organizado como referencia rápida. Cada sección incluye ejemplos ejecutables con datos clínicos simulados y, donde procede, código no ejecutable (eval: false) que muestra la sintaxis para tareas habituales en investigación médica (importar SPSS, ajustar modelos de supervivencia, etc.).


C.1 C.1 Conceptos Fundamentales

C.1.1 Asignación, Tipos y Vectores

Cuadro C.1: Tipos básicos y vectores en R
Mostrar el código
# Asignación con <- (recomendado en R)
edad     <- 45L            # entero
peso_kg  <- 78.4           # numérico (double)
sexo     <- "Mujer"        # carácter
diabetes <- TRUE           # lógico

# Vectores con c()
edades       <- c(25, 30, 45, 22, 60)
diagnostico  <- c("HTA", "DM2", "HTA", "Sano", "DM2")
hospitalizado <- c(FALSE, TRUE, TRUE, FALSE, TRUE)

# Inspeccionar
class(edades);  length(edades);  range(edades)
[1] "numeric"
[1] 5
[1] 22 60

C.1.2 Indexación: posicional y lógica

Cuadro C.2: Indexación de vectores
Mostrar el código
# Posicional
edades[1]            # primer paciente
[1] 25
Cuadro C.3: Indexación de vectores
Mostrar el código
edades[c(1, 3, 5)]   # pacientes 1, 3 y 5
[1] 25 45 60
Cuadro C.4: Indexación de vectores
Mostrar el código
edades[-1]           # todos menos el primero
[1] 30 45 22 60
Cuadro C.5: Indexación de vectores
Mostrar el código
# Lógica (filtros clínicos)
edades[edades >= 45]                # adultos mayores
[1] 45 60
Cuadro C.6: Indexación de vectores
Mostrar el código
diagnostico[hospitalizado]          # diagnósticos de hospitalizados
[1] "DM2" "HTA" "DM2"
Cuadro C.7: Indexación de vectores
Mostrar el código
edades[diagnostico == "DM2"]        # edad de diabéticos
[1] 30 60

C.1.3 Valores Perdidos: NA

En estudios clínicos los datos faltantes son la norma, no la excepción. R los representa con NA.

Cuadro C.8: Manejo de valores perdidos
Mostrar el código
hba1c <- c(6.2, 7.8, NA, 8.5, 6.9, NA)

mean(hba1c)                # NA: cualquier NA contamina el resultado
[1] NA
Cuadro C.9: Manejo de valores perdidos
Mostrar el código
mean(hba1c, na.rm = TRUE)  # 7.35: ignorar NAs
[1] 7.35
Cuadro C.10: Manejo de valores perdidos
Mostrar el código
is.na(hba1c)               # vector lógico
[1] FALSE FALSE  TRUE FALSE FALSE  TRUE
Cuadro C.11: Manejo de valores perdidos
Mostrar el código
sum(is.na(hba1c))          # 2 valores perdidos
[1] 2
Cuadro C.12: Manejo de valores perdidos
Mostrar el código
hba1c[!is.na(hba1c)]       # eliminar NAs
[1] 6.2 7.8 8.5 6.9
AdvertenciaNA no es 0 ni cadena vacía

NA == NA devuelve NA, no TRUE. Usa siempre is.na(x) para comprobar valores perdidos. En análisis observacional, documenta el patrón de pérdida (¿MCAR, MAR o MNAR?) antes de elegir entre análisis de casos completos, imputación múltiple o ponderación inversa.


C.2 C.2 Estructuras de Datos

C.2.1 Data Frames y Tibbles

El data frame es la estructura central de R para datos tabulares. Un tibble (de tibble/dplyr) es un data frame con impresión más legible.

Cuadro C.13: Construcción de un data frame clínico
Mostrar el código
pacientes <- data.frame(
  id        = 1:6,
  edad      = c(25, 30, 45, 60, 55, 72),
  sexo      = c("M", "F", "F", "M", "F", "M"),
  imc       = c(22.5, 28.0, 31.2, 26.5, 33.1, 24.8),
  hba1c     = c(5.4, 6.2, 7.8, 6.8, 8.5, 5.9),
  diabetes  = c(0, 0, 1, 1, 1, 0)
)

str(pacientes)        # estructura y tipos
'data.frame':   6 obs. of  6 variables:
 $ id      : int  1 2 3 4 5 6
 $ edad    : num  25 30 45 60 55 72
 $ sexo    : chr  "M" "F" "F" "M" ...
 $ imc     : num  22.5 28 31.2 26.5 33.1 24.8
 $ hba1c   : num  5.4 6.2 7.8 6.8 8.5 5.9
 $ diabetes: num  0 0 1 1 1 0
Cuadro C.14: Construcción de un data frame clínico
Mostrar el código
head(pacientes, 3)    # primeras 3 filas
  id edad sexo  imc hba1c diabetes
1  1   25    M 22.5   5.4        0
2  2   30    F 28.0   6.2        0
3  3   45    F 31.2   7.8        1
Cuadro C.15: Construcción de un data frame clínico
Mostrar el código
dim(pacientes)        # filas x columnas
[1] 6 6
Cuadro C.16: Construcción de un data frame clínico
Mostrar el código
names(pacientes)      # nombres de variables
[1] "id"       "edad"     "sexo"     "imc"      "hba1c"    "diabetes"

C.2.2 Listas

Las listas almacenan objetos heterogéneos (el resultado típico de un test estadístico es una lista):

Cuadro C.17: Listas: contenedores heterogéneos
Mostrar el código
resultado <- list(
  test       = "t-Student",
  p_valor    = 0.034,
  ic95       = c(0.12, 1.85),
  n_total    = 120
)
resultado$p_valor
[1] 0.034
Cuadro C.18: Listas: contenedores heterogéneos
Mostrar el código
resultado[["ic95"]]
[1] 0.12 1.85

C.3 C.3 Factores y Variables Categóricas

En investigación médica, casi toda variable de exposición o desenlace es categórica (caso/control, expuesto/no expuesto, grupo de tratamiento). R las representa con factores.

Cuadro C.19: Factores, niveles y niveles de referencia
Mostrar el código
# Convertir a factor
pacientes$sexo_f <- factor(pacientes$sexo, levels = c("M", "F"),
                           labels = c("Hombre", "Mujer"))
pacientes$diabetes_f <- factor(pacientes$diabetes,
                               levels = c(0, 1),
                               labels = c("No diabético", "Diabético"))

levels(pacientes$diabetes_f)    # niveles
[1] "No diabético" "Diabético"   
Cuadro C.20: Factores, niveles y niveles de referencia
Mostrar el código
table(pacientes$diabetes_f)     # frecuencia

No diabético    Diabético 
           3            3 

C.3.1 Recodificación con cut() y dplyr::case_when()

Cuadro C.21: Categorizar variables continuas
Mostrar el código
library(dplyr)

pacientes <- pacientes %>%
  mutate(
    # Grupos de edad clínicos
    edad_grupo = cut(edad,
                     breaks = c(0, 40, 65, Inf),
                     labels = c("<40", "40-64", ">=65"),
                     right  = FALSE),
    # Clasificación IMC (OMS)
    imc_cat = case_when(
      imc <  18.5             ~ "Bajo peso",
      imc <  25               ~ "Normopeso",
      imc <  30               ~ "Sobrepeso",
      imc >= 30               ~ "Obesidad"
    ),
    imc_cat = factor(imc_cat,
                     levels = c("Bajo peso", "Normopeso",
                                "Sobrepeso", "Obesidad"))
  )

table(pacientes$edad_grupo, pacientes$imc_cat)
       
        Bajo peso Normopeso Sobrepeso Obesidad
  <40           0         1         1        0
  40-64         0         0         1        2
  >=65          0         1         0        0
ImportanteNivel de referencia

En regresión (lineal, logística, Cox), el nivel de referencia del factor define la categoría con la que se compara cada coeficiente. Por defecto R toma el primer nivel alfabético. Para forzar uno específico (p. ej. Normopeso como referencia):

Mostrar el código
pacientes$imc_cat <- relevel(pacientes$imc_cat, ref = "Normopeso")

C.4 C.4 Importación de Datos Clínicos

En la práctica los datos llegan en CSV, Excel, SPSS o Stata. El paquete readr y haven cubren todos los formatos habituales en investigación biomédica.

Cuadro C.22: Importación desde distintos formatos
Mostrar el código
# CSV (recomendado: readr es más rápido y robusto que read.csv)
library(readr)
datos <- read_csv("datos/cohorte.csv")

# Excel (.xlsx)
library(readxl)
datos <- read_excel("datos/cohorte.xlsx", sheet = "Visita1")

# SPSS (.sav) -- muy común en investigación clínica
library(haven)
datos <- read_sav("datos/cohorte.sav")
datos <- as_factor(datos)   # convertir variables etiquetadas a factor

# Stata (.dta)
datos <- read_dta("datos/cohorte.dta")

# Exportar a CSV con codificación correcta (acentos)
write_csv(datos, "datos/cohorte_limpia.csv")
TipRutas robustas con here::here()

Evita rutas absolutas ("C:/Users/.../"). Usa proyectos de RStudio y here::here("datos", "cohorte.csv") para que el código funcione en cualquier máquina.


C.5 C.5 Manipulación de Datos con dplyr

Las cinco verbos esenciales de dplyr para preparar una cohorte:

Verbo Acción
select() elegir columnas
filter() filtrar filas
mutate() crear/modificar variables
summarise() resumir (con o sin group_by())
arrange() ordenar
Cuadro C.23: Pipeline típico de preparación de una cohorte
Mostrar el código
library(dplyr)

resumen <- pacientes %>%
  filter(edad >= 40) %>%                                  # adultos
  mutate(hba1c_alta = if_else(hba1c >= 6.5, 1L, 0L)) %>%  # ≥6.5: DM
  group_by(sexo_f) %>%
  summarise(
    n             = n(),
    edad_media    = mean(edad, na.rm = TRUE),
    imc_mediana   = median(imc, na.rm = TRUE),
    pct_hba1c_alta = mean(hba1c_alta, na.rm = TRUE) * 100,
    .groups = "drop"
  )
resumen
# A tibble: 2 × 5
  sexo_f     n edad_media imc_mediana pct_hba1c_alta
  <fct>  <int>      <dbl>       <dbl>          <dbl>
1 Hombre     2         66        25.6             50
2 Mujer      2         50        32.2            100

C.5.1 Uniones (*_join) y reestructuración (pivot_*)

Cuadro C.24: Unir tablas y pivotar a formato largo/ancho
Mostrar el código
library(dplyr); library(tidyr)

# Unir cohorte con tabla de laboratorio por id de paciente
cohorte_lab <- pacientes %>%
  left_join(laboratorio, by = "id")

# Pasar de ancho (una columna por visita) a largo (una fila por visita)
largo <- visitas %>%
  pivot_longer(cols = starts_with("pas_v"),
               names_to  = "visita",
               values_to = "pas_mmHg")

C.6 C.6 Estadísticos Descriptivos

C.6.1 Variables Continuas

Cuadro C.25: Resumen univariante de variables continuas
Mostrar el código
summary(pacientes$imc)                                  # min, Q1, med, mean, Q3, max
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  22.50   25.23   27.25   27.68   30.40   33.10 
Cuadro C.26: Resumen univariante de variables continuas
Mostrar el código
c(media = mean(pacientes$imc),
  de    = sd(pacientes$imc),
  mediana = median(pacientes$imc),
  RIC = IQR(pacientes$imc))
    media        de   mediana       RIC 
27.683333  3.959503 27.250000  5.175000 
Cuadro C.27: Resumen univariante de variables continuas
Mostrar el código
# Cuantiles personalizados
quantile(pacientes$imc, probs = c(0.05, 0.25, 0.5, 0.75, 0.95))
    5%    25%    50%    75%    95% 
23.075 25.225 27.250 30.400 32.625 

C.6.2 Variables Categóricas

Cuadro C.28: Frecuencias absolutas y relativas
Mostrar el código
# Frecuencias
table(pacientes$imc_cat)

Bajo peso Normopeso Sobrepeso  Obesidad 
        0         2         2         2 
Cuadro C.29: Frecuencias absolutas y relativas
Mostrar el código
# Proporciones
prop.table(table(pacientes$imc_cat)) * 100

Bajo peso Normopeso Sobrepeso  Obesidad 
  0.00000  33.33333  33.33333  33.33333 
Cuadro C.30: Frecuencias absolutas y relativas
Mostrar el código
# Tabla de contingencia 2x2
tabla <- table(diabetes = pacientes$diabetes_f,
               obesidad = pacientes$imc >= 30)
tabla
              obesidad
diabetes       FALSE TRUE
  No diabético     3    0
  Diabético        1    2
Cuadro C.31: Frecuencias absolutas y relativas
Mostrar el código
prop.table(tabla, margin = 1) * 100   # % por fila (riesgo en expuestos)
              obesidad
diabetes           FALSE      TRUE
  No diabético 100.00000   0.00000
  Diabético     33.33333  66.66667

C.6.3 Resumen Estratificado

Cuadro C.32: Descriptivos por grupo (típico de Tabla 1)
Mostrar el código
pacientes %>%
  group_by(diabetes_f) %>%
  summarise(
    n          = n(),
    edad_media = mean(edad),
    edad_de    = sd(edad),
    imc_mediana = median(imc),
    imc_RIC    = IQR(imc),
    .groups = "drop"
  )
# A tibble: 2 × 6
  diabetes_f       n edad_media edad_de imc_mediana imc_RIC
  <fct>        <int>      <dbl>   <dbl>       <dbl>   <dbl>
1 No diabético     3       42.3   25.8         24.8    2.75
2 Diabético        3       53.3    7.64        31.2    3.30

C.7 C.7 Funciones Propias y Control de Flujo

C.7.1 Definir funciones

Cuadro C.33: Función propia: cálculo e interpretación clínica
Mostrar el código
# Cálculo del IMC con interpretación
clasificar_imc <- function(peso_kg, altura_m) {
  imc <- peso_kg / (altura_m^2)
  categoria <- cut(imc,
                   breaks = c(0, 18.5, 25, 30, Inf),
                   labels = c("Bajo peso", "Normopeso",
                              "Sobrepeso", "Obesidad"),
                   right = FALSE)
  data.frame(imc = round(imc, 1), categoria = categoria)
}

clasificar_imc(peso_kg = c(55, 72, 95),
               altura_m = c(1.70, 1.75, 1.78))
   imc categoria
1 19.0 Normopeso
2 23.5 Normopeso
3 30.0 Sobrepeso

C.7.2 Control de flujo: if, for, sapply

Cuadro C.34: Iteración vectorizada con sapply
Mostrar el código
# Vectorizado (preferido en R)
hba1c_vals <- c(5.6, 6.1, 6.5, 7.2, 8.0)

categoria_dm <- sapply(hba1c_vals, function(x) {
  if      (x <  5.7) "Normal"
  else if (x <  6.5) "Prediabetes"
  else               "Diabetes"
})
categoria_dm
[1] "Normal"      "Prediabetes" "Diabetes"    "Diabetes"    "Diabetes"   
NotaPreferir vectorización sobre bucles

En R, for es más lento y verboso que la familia apply/map y que las funciones vectorizadas. Para un dataset clínico real (miles de filas), usa siempre dplyr::mutate() con case_when() o sapply()/purrr::map_*().


C.8 C.8 Visualización con ggplot2

ggplot2 es la herramienta estándar para visualización en publicaciones biomédicas.

Cuadro C.35: Histograma con curva de densidad
Mostrar el código
library(ggplot2)

ggplot(pacientes, aes(x = imc)) +
  geom_histogram(aes(y = after_stat(density)),
                 bins = 6, fill = "steelblue", color = "white") +
  geom_density(color = "darkred", linewidth = 1) +
  labs(x = "IMC (kg/m²)", y = "Densidad",
       title = "Distribución del IMC") +
  theme_minimal()

Cuadro C.36: Boxplot estratificado: HbA1c por estado diabético
Mostrar el código
ggplot(pacientes, aes(x = diabetes_f, y = hba1c, fill = diabetes_f)) +
  geom_boxplot(alpha = 0.7) +
  geom_jitter(width = 0.15, size = 2) +
  labs(x = NULL, y = "HbA1c (%)",
       title = "HbA1c por estado diabético") +
  theme_minimal() +
  theme(legend.position = "none")

Cuadro C.37: Diagrama de dispersión con línea de regresión
Mostrar el código
ggplot(pacientes, aes(x = imc, y = hba1c)) +
  geom_point(size = 3, color = "steelblue") +
  geom_smooth(method = "lm", se = TRUE, color = "darkred") +
  labs(x = "IMC (kg/m²)", y = "HbA1c (%)",
       title = "Relación IMC-HbA1c") +
  theme_minimal()


C.9 C.9 Tests Estadísticos en R Base

Tabla de referencia con los contrastes más usados en investigación médica:

Pregunta clínica Función de R
¿Difieren las medias de dos grupos? t.test()
¿Difieren las medianas (no normal)? wilcox.test()
¿Difieren tres o más medias? aov(), oneway.test()
¿Asociación entre dos variables categóricas? chisq.test(), fisher.test()
¿Datos apareados (antes/después)? mcnemar.test(), t.test(paired=T)
¿Es la variable normal? shapiro.test()
¿Hay correlación lineal? cor.test()
Regresión lineal lm()
Regresión logística / Poisson glm(family = binomial / poisson)
Cuadro C.38: Ejemplos: t-test, chi-cuadrado, regresión lineal
Mostrar el código
# 1) Comparar HbA1c entre diabéticos y no diabéticos
t.test(hba1c ~ diabetes_f, data = pacientes)

    Welch Two Sample t-test

data:  hba1c by diabetes_f
t = -3.4207, df = 2.8523, p-value = 0.04515
alternative hypothesis: true difference in means between group No diabético and group Diabético is not equal to 0
95 percent confidence interval:
 -3.65529198 -0.07804135
sample estimates:
mean in group No diabético    mean in group Diabético 
                  5.833333                   7.700000 
Cuadro C.39: Ejemplos: t-test, chi-cuadrado, regresión lineal
Mostrar el código
# 2) Asociación diabetes ~ obesidad (Fisher por n pequeño)
fisher.test(table(pacientes$diabetes_f, pacientes$imc >= 30))

    Fisher's Exact Test for Count Data

data:  table(pacientes$diabetes_f, pacientes$imc >= 30)
p-value = 0.4
alternative hypothesis: true odds ratio is not equal to 1
95 percent confidence interval:
 0.2031288       Inf
sample estimates:
odds ratio 
       Inf 
Cuadro C.40: Ejemplos: t-test, chi-cuadrado, regresión lineal
Mostrar el código
# 3) Regresión lineal: HbA1c ~ IMC + edad
modelo <- lm(hba1c ~ imc + edad, data = pacientes)
summary(modelo)

Call:
lm(formula = hba1c ~ imc + edad, data = pacientes)

Residuals:
      1       2       3       4       5       6 
 0.2795 -0.4996  0.0762  0.2576  0.1586 -0.2723 

Coefficients:
             Estimate Std. Error t value Pr(>|t|)   
(Intercept) -1.379357   1.316864  -1.047  0.37184   
imc          0.279194   0.046683   5.981  0.00936 **
edad         0.008718   0.010235   0.852  0.45692   
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.4079 on 3 degrees of freedom
Multiple R-squared:  0.9288,    Adjusted R-squared:  0.8814 
F-statistic: 19.57 on 2 and 3 DF,  p-value: 0.01899
Cuadro C.41: Ejemplos: t-test, chi-cuadrado, regresión lineal
Mostrar el código
confint(modelo)
                  2.5 %     97.5 %
(Intercept) -5.57020549 2.81149089
imc          0.13062701 0.42776027
edad        -0.02385378 0.04128988
Cuadro C.42: Regresión logística: probabilidad de diabetes
Mostrar el código
# Pacientes simulados más amplios para que el modelo sea estimable
set.seed(123)
n <- 200
sim <- data.frame(
  edad = rnorm(n, 55, 12),
  imc  = rnorm(n, 28, 5)
)
sim$diabetes <- rbinom(n, 1,
                       plogis(-7 + 0.05*sim$edad + 0.12*sim$imc))

mod_log <- glm(diabetes ~ edad + imc, data = sim, family = binomial)
# Odds ratios con IC95%
exp(cbind(OR = coef(mod_log), confint.default(mod_log)))
                      OR        2.5 %      97.5 %
(Intercept) 0.0005718736 3.304375e-05 0.009897163
edad        1.0414789433 1.011409e+00 1.072443165
imc         1.1652214003 1.085568e+00 1.250719795

C.10 C.10 Paquetes Esenciales en Bioestadística

Selección curada de paquetes que el investigador clínico encuentra de forma recurrente. El bloque siguiente es informativo (no ejecutado).

Cuadro C.43: Paquetes recomendados según tarea
Mostrar el código
# --- Reportes clínicos y "Tabla 1" ---------------------------------------
library(gtsummary)   # Tablas publicables a partir de modelos / data frames
library(tableone)    # Tabla 1 demográfica clásica

tabla1 <- tbl_summary(pacientes,
                      by = diabetes_f,
                      missing = "no") %>%
  add_p() %>% add_overall()

# --- Análisis epidemiológico ---------------------------------------------
library(epiR)        # Medidas de asociación 2x2 (RR, OR, NNT)
library(epitools)    # Tablas, cálculo de IC para incidencia / prevalencia

# --- Supervivencia -------------------------------------------------------
library(survival)
library(survminer)
fit_km  <- survfit(Surv(tiempo, evento) ~ grupo, data = cohorte)
ggsurvplot(fit_km, risk.table = TRUE, pval = TRUE)

fit_cox <- coxph(Surv(tiempo, evento) ~ edad + sexo + tratamiento,
                 data = cohorte)
summary(fit_cox)

# --- Inferencia causal / emparejamiento ----------------------------------
library(MatchIt)     # Propensity score matching
library(WeightIt)    # Ponderación inversa de probabilidad (IPTW)

# --- Datos perdidos ------------------------------------------------------
library(mice)        # Imputación múltiple (FCS)
library(naniar)      # Visualización del patrón de missing

# --- Modelos: limpieza y extracción de resultados ------------------------
library(broom)       # tidy(), glance(), augment() para modelos
library(performance) # Diagnósticos de regresión (colinealidad, supuestos)

# --- Meta-análisis -------------------------------------------------------
library(meta)        # Meta-análisis clásico (efecto fijo / aleatorio)
library(metafor)     # Meta-análisis y meta-regresión flexibles
TipCitar los paquetes que usas

La revista te pedirá la versión de R y los paquetes. Usa citation("survival") y sessionInfo() en el cierre del análisis y guarda la salida.


C.11 C.11 Reproducibilidad en Investigación Médica

Un análisis médico debe poder reproducirse exactamente meses o años después (revisión por pares, auditoría, dudas del comité ético).

Cuadro C.44: Buenas prácticas de reproducibilidad
Mostrar el código
# 1) Semilla aleatoria SIEMPRE antes de cualquier simulación o aleatorización
set.seed(20260101)

# 2) Proyecto de RStudio + rutas relativas con here
library(here)
datos <- read_csv(here("datos", "cohorte_v3.csv"))

# 3) Capturar el entorno: versión de R y paquetes
sessionInfo()

# 4) (Opcional) renv para bloquear versiones de paquetes
# install.packages("renv"); renv::init(); renv::snapshot()

# 5) Análisis dentro de un documento Quarto/Rmd
#    -> el código y los resultados viven juntos
AdvertenciaSin semilla, sin reproducibilidad

Cualquier procedimiento estocástico (bootstrap, validación cruzada, imputación múltiple, simulación) debe ir precedido por set.seed(). Sin semilla, dos ejecuciones del mismo script darán p-valores e intervalos distintos — inaceptable en un análisis clínico.


C.12 C.12 Resolución de Problemas Comunes

Síntoma Causa habitual Solución
mean(x) devuelve NA Hay valores perdidos mean(x, na.rm = TRUE)
Coeficiente de un factor no aparece Es el nivel de referencia relevel(f, ref = "...")
El gráfico no se ve en RStudio Ventana cerrada o tamaño nulo dev.off() y volver a ejecutar
cannot find function "..." Paquete no cargado library(paquete) o install.packages("paquete")
argument "x" is missing Olvidaste un argumento Consulta ?nombre_funcion
Lectura de CSV con acentos rotos Codificación incorrecta read_csv(..., locale = locale(encoding = "Latin1"))
non-numeric argument to binary operator Tipo carácter donde esperabas numérico as.numeric(x) (cuidado con factores: as.numeric(as.character(x)))
Resultados distintos en cada ejecución Falta set.seed() Fijar semilla antes del análisis
object '...' not found Nombre mal escrito o variable de otro entorno ls() para listar objetos, names(df) para variables

C.12.1 Comandos de ayuda

Cuadro C.45: Sistema de ayuda de R
Mostrar el código
?mean                  # ayuda de una función
??"survival analysis"  # búsqueda por palabra clave
help(package = "dplyr")
vignette("dplyr")      # tutoriales largos del paquete
example(lm)            # ejemplos ejecutables

# Diagnóstico rápido del entorno
getwd();  setwd("ruta")
ls();     rm(list = ls())   # listar / limpiar objetos
sessionInfo()

C.13 Resumen

Esta guía te ha llevado del vector más simple a un flujo completo de análisis clínico en R: importar (C.4), preparar (C.3, C.5), describir (C.6), visualizar (C.8), contrastar (C.9) y dejar todo reproducible (C.11). Para funciones de alto nivel específicas del curso (freq(), icm(), tabla2x2(), etc.) consulta el Apéndice B. Para el repaso matemático subyacente, el Apéndice A.