Ensayo

Análisis Estudio

Se descargó la base de datos y el codebook el día 18/11/2025. Primeramente se procedió a explorar la base de datos.

Exploracion base de datos

Se realiza una familiarización con la base de datos tal cual como se descargó del REDCap.

Ver código
library(readxl)
datos <- read_excel("BASE.xlsx")

library(dlookr)
overview(datos) %>% 
  datatable(options = list(pageLength = 16))

En este caso, no hay variables codificadas como categóricas. Ningún dato está codificado en formato fecha,

Ver código
library(janitor)
library(dplyr)


cols_fecha <- grep("Fecha", names(datos), value = TRUE) 
datos <- datos %>% mutate(across(all_of(cols_fecha), ~ as.Date(.x, format = "%d/%m/%Y"))) 
datos <- datos %>% clean_names()

datos <- datos %>%
  clean_names()  # Convierte todo a snake_case automáticamente

diagnose(datos) %>% 
  mutate(across(where(is.numeric), ~round(., 1))) %>% #redondear a 1
  datatable(options = list(pageLength = 15))

Notas del análisis inicial

  • Existe un gran número de datos pérdidos, lo cuales pueden ser de tipo estructural, explicado por la naturaleza de longitudinal del estudio.

  • Existen dos columnas del ID del sujeto Record.ID y ID.del.paciente

  • Se limpiaron los nombres de las columnas (se eliminaron tildes, mayúsculas y espacios, y signos de puntuación)

Ver código
names(datos)[c(1,6)] <- paste0("Record_ID", 1:2) # se renombra las columnas

INCLUSION <- table(datos$cumple_criterios_de_inclusion)
cumplenCI <- INCLUSION["Cumple"]
EXCLUSION <- table(datos$cumplimiento_criterios)
cumplenCE <- EXCLUSION["Cumple"]

Al revisar los criterios de elegibilidad

  • 28 cumplen con los criterios de inclusión

  • 24 no cumplen con los criterios de exclusión.

Se procede a filtrar la base de datos

Ver código
BASE = datos
library(dplyr)
BASE <- BASE %>% filter(cumple_criterios_de_inclusion == "Cumple")
BASE <- BASE %>% filter(cumplimiento_criterios == "Cumple")

Consort

A continuación se muesra el diagrama de depuración de la base de datos

Ver código
library(DiagrammeR)

g <- DiagrammeR::grViz("
digraph PRISMA {
  
  graph [rankdir = TB, nodesep = 0.5, ranksep = 0.8]
  node [shape = box, style = 'filled,rounded', fontname = Arial, fontsize = 12]
  
  identificacion [label = 'Identificación\n\n Pacientes iniciales\n(n = 30)',                   fillcolor = 'grey97', penwidth = 1, width = 2.5]
  
  excluidos1 [label = 'n = 2\n\nNo cumplieron\ncriterios de inclusión', fillcolor = 'snow', width = 1.5]
  
  seleccion [label = 'Selección\n\nPacientes elegibles\n(n = 28)', 
             fillcolor = 'grey97', penwidth = 1, width = 2.5]
  
  excluidos2 [label = 'n = 4\n\n Cumplieron criterios de exclusión', 
              fillcolor = 'snow', width = 1.5]
  
  incluidos [label = 'Incluidos\n\nPacientes análisis\n(n = 24)', 
             fillcolor = 'grey97', penwidth = 1, width = 2.5]
  
  identificacion -> excluidos1 [dir = none, style = dashed]
  identificacion -> seleccion
  seleccion -> excluidos2 [dir = none, style = dashed]
  seleccion -> incluidos
  
  {rank = same; identificacion; excluidos1}
  {rank = same; seleccion; excluidos2}
}
")
g
Figure 1: Diagrama de flujo CONSORT
Ver código
# Exportar como PNG
library(DiagrammeRsvg)
library(rsvg)

# Exportar como PNG
g %>%
  export_svg() %>%
  charToRaw() %>%
  rsvg_png("diagrama_consort.png")
Ver código
library(dplyr)

# Mantener solo los registros de 'datos' cuyo ID está en 'BASE'
datos_f <- datos %>%
  semi_join(BASE, by = "Record_ID1")

Información general pacientes

Se realiza el análisis univariado de las variables de antecedentes y estratíficación (solo 1 medición).

Ver código
library(gtsummary)
library(dplyr)

# Primero crear dataset único por paciente
datos_tabla <- datos_f %>%
  arrange(Record_ID1) %>%
  group_by(Record_ID1) %>%
  slice(1) %>%
  ungroup()


# Crear la tabla
datos_tabla %>%
    select(
    edad_calculada,
    sexo,
    diagnostico_del_paciente_10,
    sitio_metastasico_identificado,
    ecog_15
  ) %>%
  tbl_summary(
    statistic = list(
      all_continuous() ~ "{mean} ± {sd}",
      all_categorical() ~ "{n} ({p}%)"
    ),
    digits = list(
      all_continuous() ~ 1,
      all_categorical() ~ c(0, 1)
    ),
    missing = "ifany",
    missing_text = "No reportado",
    label = list(
      edad_calculada ~ "Edad (años)",
      sexo ~ "Sexo",
      diagnostico_del_paciente_10 ~ "Diagnóstico principal",
      sitio_metastasico_identificado ~ "Sitio metastásico identificado",
      ecog_15 ~ "ECOG"
    )
  ) %>%
  add_n() %>%
  bold_labels() %>%
  italicize_levels() %>%
  modify_caption("**Tabla 1. Características de los pacientes incluidos en el estudio (N = 24)**")
Tabla 1. Características de los pacientes incluidos en el estudio (N = 24)
Characteristic N N = 241
Edad (años) 24 49.4 ± 20.9
Sexo 24
    Hombre
8 (33.3%)
    Mujer
16 (66.7%)
Diagnóstico principal 24
    Cáncer de Colón
1 (4.2%)
    Cáncer de Estómago
5 (20.8%)
    Cáncer de Páncreas
2 (8.3%)
    Cáncer de Vias Biliares
1 (4.2%)
    Leucemia Linfoide Aguda Nuevo dx
2 (8.3%)
    Leucemia Linfoide Aguda Recaída
6 (25.0%)
    Leucemia Mieloide Aguda Nuevo dx
6 (25.0%)
    Leucemia Mieloide Aguda Recaída
1 (4.2%)
Sitio metastásico identificado 24
    No
1 (4.2%)
    No aplica
14 (58.3%)
    Si
9 (37.5%)
ECOG 24
    ECOG 1
6 (25.0%)
    ECOG 2
3 (12.5%)
    No aplica
14 (58.3%)
    No Disponible
1 (4.2%)
1 Mean ± SD; n (%)
Ver código
library(gtsummary)
library(dplyr)

# Primero convertir blastos a numérico en el dataframe original
datos_f <- datos_f %>%
  mutate(
    blastos_en_cuadro_hematico_percent = as.numeric(blastos_en_cuadro_hematico_percent)
  )

# Crear dataset priorizando registros CON información
datos_tabla1 <- datos_f %>%
  group_by(Record_ID1) %>%
  # Contar cuántos NAs tiene cada registro en las variables de interés
  mutate(
    na_count = rowSums(is.na(across(c(
      metastasis,
      numero_de_metastasis_274,
      blastos_por_mielograma_dx,
      blastos_por_citometria_de_flujo,
      blastos_en_cuadro_hematico_percent
    ))))
  ) %>%  # FALTABA ESTE %>%
  # Ordenar: los que tienen MENOS NAs primero
  arrange(Record_ID1, na_count) %>%
  # Tomar el registro con más información
  slice(1) %>%
  ungroup() %>%
  select(-na_count)

# Verificar cuántos datos quedaron
cat("Datos disponibles:\n")
Datos disponibles:
Ver código
datos_tabla1 %>%
  summarise(
    total = n(),
    metastasis_disponible = sum(!is.na(metastasis)),
    numero_metastasis_disponible = sum(!is.na(numero_de_metastasis_274)),
    blastos_mielograma = sum(!is.na(blastos_por_mielograma_dx)),
    blastos_citometria = sum(!is.na(blastos_por_citometria_de_flujo)),
    blastos_hematico = sum(!is.na(blastos_en_cuadro_hematico_percent))
  ) %>%
  print()
# A tibble: 1 × 6
  total metastasis_disponible numero_metastasis_disponible blastos_mielograma
  <int>                 <int>                        <int>              <int>
1    24                    22                            9                 11
# ℹ 2 more variables: blastos_citometria <int>, blastos_hematico <int>
Ver código
# Crear la tabla
datos_tabla1 %>%
  select(
    metastasis,
    numero_de_metastasis_274,
    blastos_por_mielograma_dx,
    blastos_por_citometria_de_flujo,
    blastos_en_cuadro_hematico_percent
  ) %>%
  tbl_summary(
    type = list(
      metastasis ~ "categorical",
      numero_de_metastasis_274 ~ "continuous",  # Forzar como continua
      blastos_por_mielograma_dx ~ "continuous",
      blastos_por_citometria_de_flujo ~ "continuous",
      blastos_en_cuadro_hematico_percent ~ "continuous"
    ),
    statistic = list(
      all_continuous() ~ "{mean} ± {sd}",
      all_categorical() ~ "{n} ({p}%)"
    ),
    digits = list(
      all_continuous() ~ 1,
      all_categorical() ~ c(0, 1)
    ),
    missing = "ifany",
    missing_text = "No reportado",
    label = list(
      metastasis ~ "Presencia de metástasis",
      numero_de_metastasis_274 ~ "Número de metástasis",
      blastos_por_mielograma_dx ~ "Blastos mielograma (%)",
      blastos_por_citometria_de_flujo ~ "Blastos citometría (%)",
      blastos_en_cuadro_hematico_percent ~ "Blastos hemograma (%)"
    )
  ) %>%
  add_n() %>%
  bold_labels() %>%
  italicize_levels() %>%
  modify_caption("**Tabla 2. Características pacientes (sin n completo)**") %>%
  modify_footnote(all_stat_cols() ~ "N varía según disponibilidad de datos para cada variable")
Tabla 2. Características pacientes (sin n completo)
Characteristic N N = 241
Presencia de metástasis 22
    No
3 (13.6%)
    No aplica
10 (45.5%)
    Si
9 (40.9%)
    No reportado
2
Número de metástasis 9 1.3 ± 1.0
    No reportado
15
Blastos mielograma (%) 11 46.6 ± 36.4
    No reportado
13
Blastos citometría (%) 8 33.4 ± 33.9
    No reportado
16
Blastos hemograma (%) 1 70.0 ± NA
    No reportado
23
1 N varía según disponibilidad de datos para cada variable

Revsión respuestas no estructuradas

Ver código
library(knitr)
table(datos_f$alteracion_genetica_279) %>% 
  kable()
Var1 Freq
Alteración genética: Fecha toma 30-sep-2024 Fecha reporte en SAHI: 03-oct-2024 FLT3-ITD: Muestra POSITIVA para mutación FLT3-ITD en estado Heterocigoto. Relación alelo mutado/alelo normal = 1.65 D835: Muestra NEGATIVA para mutación FLT3-TKD D835. Homocigoto Normal 1
BCR ABL p 210 negativo, BCR/ABL p 190 negativo. 1
Panel genético de 28 traslocaciones negativo, FTL3 negativo 1
PCR BCR ABL p190 y 210 negativos 1
Reporte: Cariotipo 46,XX,add(15)(p11.2)[11]/46,XX[1] dos clonas celulares. En la primera la cual representa el 91.6% de las células analizadas se observa una adición de material genético de origen desconocido en el brazo corto del cromosoma 15, en la región p11.2. En la segunda clona la cual representa el 8.3% de las células analizadas se observa un complemento cromosómico femenino normal. Panel de 28 mutaciones de leucemia aguda sin detección de re-arreglos o mutaciones. Mutación FLT3 negativo, HLA de potenciales donantes con compatibilidad idéntico para un familiar y 3 haploidenticos. 1
Ver código
library(stringi)
datos_f$localizacion_275 <- datos_f$localizacion_275 %>%
  stri_trans_general("Latin-ASCII") %>%  # quitar tildes
  tolower() %>%                          # minusculas
  gsub("[^a-z0-9 ]", " ", .) %>%         # quitar signos
  gsub("\\s+", " ", .) %>%               # espacios dobles
  trimws()

table(datos_f$localizacion_275) %>% 
  kable()
Var1 Freq
compromiso ganglionar supraclavicular izquierdo ganglio de virchow 1
ganglionar 1
higado 3
peritoneal 3
sitio de metastasis compromiso oseo hepatico peritoneal y diseminacion linfangitica toracica 1

Antecedentes

Ver código
library(tidyr)
library(ggplot2)


# Lista de variables
antecedentes <- c("infarto_de_miocardio","insuficiencia_cardiaca_congestiva","enfermedad_vascular_periferica", "enfermedad_cerebrovascular",
"demencia", "enfermedad_pulmonar_cronica", "enfermedad_ulcerosa",
"patologia_hepatica_ligera", "patologia_hepatica_moderada_o_grave",
"diabetes", "diabetes_con_lesion_organica", "hemiplejia",
"patologia_renal_moderada_o_grave", "otra_s")

# Calcular porcentajes de "Sí"
# Calcular porcentajes de "Sí" (asumiendo que tu variable ID se llama "ID" o similar)
datos_f %>%
  distinct(Record_ID1, .keep_all = TRUE) %>%  # Mantener solo un registro por ID
  select(all_of(antecedentes)) %>%
  summarise(across(everything(), ~mean(. == "Si", na.rm = TRUE) * 100)) %>%
  pivot_longer(everything(), names_to = "Variable", values_to = "Porcentaje") %>%
  mutate(Variable = gsub("_", " ", Variable),
         Variable = tools::toTitleCase(Variable)) %>%
  ggplot(aes(x = reorder(Variable, Porcentaje), y = Porcentaje)) +
  geom_col(fill = "steelblue", alpha = 0.8) +
  geom_text(aes(label = paste0(round(Porcentaje, 1), "%")), 
            hjust = -0.2, size = 3.5) +
  coord_flip() +
  labs(title = "Distribución porcentual Antecedentes",
       subtitle = "N = 24 pacientes",
       x = NULL,
       y = "Porcentaje (%)") +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5, face = "bold"),
        plot.subtitle = element_text(hjust = 0.5),
        panel.grid.major.y = element_blank()) +
  scale_y_continuous(limits = c(0, 100), expand = expansion(mult = c(0, 0.05)))

En antecedentes “otros” se revisa que se puede encontrar solamente con el primero

Ver código
library(tidyverse)
library(tm)
library(SnowballC)


texto <- datos_f$nombre_antecedente_1
texto <- texto[!is.na(texto)]

texto <- texto %>%
  stri_trans_general("Latin-ASCII") %>%  # quitar tildes
  tolower() %>%                          # minusculas
  gsub("[^a-z0-9 ]", " ", .) %>%         # quitar signos
  gsub("\\s+", " ", .) %>%               # espacios dobles
  trimws()

# Crear corpus limpio
corp <- Corpus(VectorSource(texto))

# QUITAR CONECTORES (stopwords en español)
corp <- tm_map(corp, removeWords, stopwords("spanish"))

# Eliminar espacios extra
corp <- tm_map(corp, stripWhitespace)

corp <- tm_map(corp, stemDocument, language = "spanish")


corp <- Corpus(VectorSource(texto))
tdm <- TermDocumentMatrix(corp)
mat <- as.matrix(tdm)

freq <- sort(rowSums(mat), decreasing = TRUE)
df <- data.frame(
  palabra = names(freq),
  frecuencia = freq
)



library(gt)

df %>%
  gt() %>%
  tab_header(
    title = md("**Tabla: Frecuencia de antecedentes**")
  ) %>%
  fmt_number(
    columns = "frecuencia",
    decimals = 0
  ) %>%
  cols_label(
    palabra = "Antecedente",
    frecuencia = "Frecuencia"
  ) %>%
  tab_style(
    style = cell_text(weight = "bold"),
    locations = cells_column_labels(everything())
  )
Tabla: Frecuencia de antecedentes
Antecedente Frecuencia
alcalina 2
elevacion 2
fosfatasa 2
trombosis 2
anemia 2
con 2
izquierdo 2
hipertrigliceridemia 2
hiperglucemia 2
confluente 1
derecha 1
llegada 1
parcial 1
subclavia 1
vena 1
yugulosubclavio 1
cronica 1
tos 1
arterial 1
hipertension 1
esmerilado 1
lsd 1
nodulo 1
pulmonar 1
vidrio 1
inferior 1
miembro 1
profunda 1
sospecha 1
venosa 1
cardiopatia 1
concentrica 1
hipertrofica 1
celulitis 1
pie 1
enfermedad 1
gastroesofagico 1
reflujo 1
estudio 1
miomatosis 1
uterina 1
esteatosis 1
hepatica 1
moderada 1
anticuerpos 1
calientes 1
hemolitica 1
requerimiento 1
trasfusion 1
neuropatia 1
sensitiva 1
hiperuricemia 1
aguda 1
sinusitis 1
axonal 1
controlada 1
motora 1
polineuropatia 1
sensitivo 1
hipoxemia 1
bilateral 1
glaucoma 1

En este caso no hay información concluyente debido a los diversos nombres dispuestos. Una opción es realizar un diccionario de sinónimos para poder categorizar. Otra opción es la depuración manual o utilizar software como N-vivo.

Variables de “verificación medicamento”

Ver código
ids_con_fecha <- datos_f %>%
  filter(!is.na(fecha_de_dispensacion)) %>%
  pull(Record_ID1) %>% 
  unique()
ids_con_fecha
 [1]  1  3  4  6  8  9 10 11 12 13 19 25 26 27 29 30
Ver código
ids_con_dosis <- datos_f %>%
  filter(!is.na(dosis_389)) %>%
  pull(Record_ID1) %>% 
  unique()
ids_con_dosis
 [1]  1  3  4  6  8  9 10 11 12 13 19 25 26 27 29 30
Ver código
table(datos_f$esta_tomando_el_medicamento_de_estudio)

No Si 
 2 21 
  • 16 pacientes tuvieron fecha de dispensación del medicamento
  • 16 pacientes tuvieron “dosis” del medicamento.
  • 21 pacientes estan tomando el medicamento.

Evolución por ciclos sin discriminar por tipo de cáncer

Ver código
# Crear la tabla
datos_f %>%
    select(
    event_name
  ) %>%
  tbl_summary(
    statistic = list(
      all_continuous() ~ "{mean} ± {sd}",
      all_categorical() ~ "{n} ({p}%)"
    ),
    digits = list(
      all_continuous() ~ 1,
      all_categorical() ~ c(0, 1)
    ),
    missing = "ifany",
    missing_text = "No reportado",
    label = list(
      event_name  ~ "Evento")
  ) %>%
  add_n() %>%
  bold_labels() %>%
  italicize_levels() %>%
  modify_caption("**Distribución momentos en la muestra que cumple criteriosde elegibilidad**") %>% 
 modify_footnote(all_stat_cols() ~ "1. N se toma como el número de momentos, 2. n(%)")
Distribución momentos en la muestra que cumple criteriosde elegibilidad
Characteristic N N = 1,1291
Evento 1,129
    Ciclo 2
20 (1.8%)
    Evento adverso
245 (21.7%)
    Medicamento concomitante
712 (63.1%)
    Objetivos exploratorios
79 (7.0%)
    Visita de finalización
23 (2.0%)
    Visita de inicio/Ciclo 1
24 (2.1%)
    Visita de tamizaje
24 (2.1%)
    Visita no programada
2 (0.2%)
1 N se toma como el número de momentos, 2. n(%)
  1. N se toma como el número de momentos, 2. n(%)
  • Frente a “medicamento concomitante” es posible crear una columna nueva en torno de medicamento concomitante (más que ser un momento adicional).

  • Evento adverso tampoco es un momento puntual, la columna “ha_presentado_evento_adverso” da cuenta de la misma información y la columna visita_numero indica en qué momento fue presentado dicho evento.

  • No se incluye a este punto de análisis “Objetivos exploratorios”.

  • Los momentos de comparación son: Visita de inicio/ciclo 1, Ciclo 2, Visita de finalización.

Exámen físico - signos vitales

Ver código
# Definir momentos de análisis
momentos_analisis <- c("Visita de inicio/Ciclo 1", "Ciclo 2", "Visita de finalización")
df_long <- datos_f %>%
  filter(event_name %in% momentos_analisis)

# Selección de variables
vars_numericas <- c("peso_en_kilogramos", "presion_sistolica_en_mm_hg", 
                    "presion_diastolica_en_mm_hg", "frecuencia_cardiaca_l_min")
vars_categoricas <- c("cabeza_y_cuello", "cardiovascular", "pulmonar", 
                      "abdomen", "extremidades", "neurologico")

# Limpiar y convertir variables categóricas
df_long <- df_long %>%
  mutate(across(all_of(vars_categoricas), ~ {
    case_when(
      . %in% c("", " ", NA) ~ NA_character_,
      TRUE ~ trimws(.)
    )
  })) %>%
  mutate(across(all_of(vars_categoricas), as.factor)) %>%
  mutate(event_name = factor(event_name, levels = momentos_analisis))

# Calcular resúmenes numéricos
res_num <- df_long %>%
  select(event_name, all_of(vars_numericas)) %>%
  pivot_longer(-event_name, names_to = "variable", values_to = "valor") %>%
  group_by(event_name, variable) %>%
  summarise(
    resumen = sprintf("%.1f (%.1f)", mean(valor, na.rm = TRUE), sd(valor, na.rm = TRUE)),
    .groups = "drop"
  )

# Calcular resúmenes categóricos (moda)
res_cat <- df_long %>%
  select(event_name, all_of(vars_categoricas)) %>%
  pivot_longer(-event_name, names_to = "variable", values_to = "valor") %>%
  filter(!is.na(valor)) %>%
  group_by(event_name, variable, valor) %>%
  summarise(n = n(), .groups = "drop_last") %>%
  mutate(pct = n / sum(n) * 100) %>%
  ungroup() %>%
  mutate(resumen = sprintf("%s: %d (%.1f%%)", valor, n, pct)) %>%
  group_by(event_name, variable) %>%
  summarise(resumen = paste(resumen, collapse = "; "), .groups = "drop")  # Junta todos los niveles


# Crear tabla pivotada
tabla_final <- bind_rows(res_num, res_cat) %>%
  pivot_wider(names_from = event_name, values_from = resumen)

# Orden y nombres bonitos
orden_filas <- c(
  "peso_en_kilogramos", "presion_sistolica_en_mm_hg", 
  "presion_diastolica_en_mm_hg", "frecuencia_cardiaca_l_min",
  "cabeza_y_cuello", "cardiovascular", "pulmonar", 
  "abdomen", "extremidades", "neurologico"
)

nombres_bonitos <- c(
  "peso_en_kilogramos" = "Peso (kg)",
  "presion_sistolica_en_mm_hg" = "Presión sistólica (mmHg)",
  "presion_diastolica_en_mm_hg" = "Presión diastólica (mmHg)",
  "frecuencia_cardiaca_l_min" = "Frecuencia cardiaca (l/min)",
  "cabeza_y_cuello" = "Cabeza y cuello",
  "cardiovascular" = "Cardiovascular",
  "pulmonar" = "Pulmonar",
  "abdomen" = "Abdomen",
  "extremidades" = "Extremidades",
  "neurologico" = "Neurológico"
)

tabla_final <- tabla_final %>%
  mutate(variable = factor(variable, levels = orden_filas)) %>%
  arrange(variable) %>%
  mutate(variable = nombres_bonitos[as.character(variable)])

# Calcular n por evento
n_eventos <- df_long %>%
  group_by(event_name) %>%
  summarise(n = n_distinct(Record_ID1))

# Crear títulos de columnas
titulo_inicio <- paste0("**Ciclo 1**<br>N = ",                       n_eventos$n[n_eventos$event_name == "Visita de inicio/Ciclo 1"])

titulo_c2 <- paste0("**Ciclo 2**<br>N = ",                     n_eventos$n[n_eventos$event_name == "Ciclo 2"])
titulo_final <- paste0("**Finalización**<br>N = ",                        n_eventos$n[n_eventos$event_name == "Visita de finalización"])


# Crear tabla GT estilo gtsummary
gt_examen <- tabla_final %>%
  gt() %>%
  # TÍTULO PRINCIPAL
  tab_header(
    title = md("** Evolución variables exámen físico  - signos vitales por momento**")
  ) %>%
  cols_label(
    variable = "**Característica**",
    `Visita de inicio/Ciclo 1` = md(titulo_inicio),
    `Ciclo 2` = md(titulo_c2),
    `Visita de finalización` = md(titulo_final)
  ) %>%
  tab_style(
    style = cell_text(weight = "bold"),
    locations = cells_column_labels()
  ) %>%
  tab_style(
    style = cell_borders(sides = "bottom", weight = px(2)),
    locations = cells_column_labels()
  ) %>%
  tab_style(
    style = cell_borders(sides = "top", weight = px(2)),
    locations = cells_body(rows = 1)
  ) %>%
  tab_style(
    style = cell_text(align = "left"),
    locations = cells_body(columns = variable)
  ) %>%
  tab_style(
    style = cell_text(align = "center"),
    locations = cells_body(columns = -variable)
  ) %>%
  # Estilo del título
  tab_style(
    style = cell_text(
      weight = "bold",
      size = px(14),
      align = "left"
    ),
    locations = cells_title(groups = "title")
  ) %>%
  tab_options(
    table.font.names = "Arial",
    table.font.size = px(12),
    data_row.padding = px(5),
    table.border.top.style = "hidden",
    table.border.bottom.style = "solid",
    table.border.bottom.width = px(2),
    column_labels.border.bottom.width = px(2),
    column_labels.border.top.width = px(2),
    heading.align = "left"
  ) %>%
  tab_footnote(
    footnote = "Media (DE) para variables continuas; Moda: n (%) para variables categóricas",
    locations = cells_column_labels(columns = variable)
  )

gt_examen
** Evolución variables exámen físico - signos vitales por momento**
**Característica**1 Ciclo 1
N = 24
Ciclo 2
N = 20
Finalización
N = 23
Peso (kg) 58.2 (15.0) 58.7 (14.3) 59.6 (16.6)
Presión sistólica (mmHg) 108.0 (12.3) 109.7 (18.4) 106.3 (17.0)
Presión diastólica (mmHg) 66.1 (9.5) 68.4 (10.7) 60.3 (18.4)
Frecuencia cardiaca (l/min) 82.2 (12.6) 81.0 (10.9) 77.4 (14.7)
Cabeza y cuello Anormal: 4 (16.7%); Normal: 20 (83.3%) Anormal: 4 (22.2%); Normal: 14 (77.8%) Anormal: 3 (16.7%); Normal: 15 (83.3%)
Cardiovascular Anormal: 8 (33.3%); Normal: 16 (66.7%) Anormal: 5 (27.8%); Normal: 13 (72.2%) Anormal: 5 (27.8%); Normal: 13 (72.2%)
Pulmonar Anormal: 8 (33.3%); Normal: 16 (66.7%) Anormal: 9 (50.0%); Normal: 9 (50.0%) Anormal: 9 (50.0%); Normal: 9 (50.0%)
Abdomen Anormal: 12 (50.0%); Normal: 12 (50.0%) Anormal: 7 (38.9%); Normal: 11 (61.1%) Anormal: 10 (55.6%); Normal: 8 (44.4%)
Extremidades Anormal: 10 (41.7%); Normal: 14 (58.3%) Anormal: 9 (50.0%); Normal: 9 (50.0%) Anormal: 9 (50.0%); Normal: 9 (50.0%)
Neurológico Anormal: 2 (8.3%); Normal: 22 (91.7%) Anormal: 2 (11.1%); Normal: 16 (88.9%) Anormal: 1 (5.6%); Normal: 17 (94.4%)
1 Media (DE) para variables continuas; Moda: n (%) para variables categóricas

Función cardiaca

Ver código
# Selección de variables
vars_numericas1 <- c("frecuencia_367", "pr", "qrs", "qtc", "grosor_de_la_pared_del_septo_interventricular_mm", "grosor_de_la_pared_posterior_mm", "dimension_diastolica_interna_del_ventriculo_izquierdo_mm", "dimension_sistolica_interna_del_ventriculo_izquierdo_mm", "indice_de_masa_ventriculo_izquierdo_g_m2", "fraccion_de_eyeccon_ventriculo_izquierdo_percent")
vars_categoricas1 <- c("electrocardiograma", "ecocardiograma")

# Limpiar y convertir variables categóricas
df_long <- df_long %>%
  mutate(across(all_of(vars_categoricas1), ~ {
    case_when(
      . %in% c("", " ", NA) ~ NA_character_,
      TRUE ~ trimws(.)
    )
  })) %>%
  mutate(across(all_of(vars_categoricas1), as.factor)) %>%
  mutate(event_name = factor(event_name, levels = momentos_analisis))

# Calcular resúmenes numéricos
res_num1 <- df_long %>%
  select(event_name, all_of(vars_numericas1)) %>%
  pivot_longer(-event_name, names_to = "variable", values_to = "valor") %>%
  group_by(event_name, variable) %>%
  summarise(
    resumen = sprintf("%.1f (%.1f)", mean(valor, na.rm = TRUE), sd(valor, na.rm = TRUE)),
    .groups = "drop"
  )


# Calcular resúmenes categóricos (moda)
res_cat1 <- df_long %>%
  select(event_name, all_of(vars_categoricas1)) %>%
  pivot_longer(-event_name, names_to = "variable", values_to = "valor") %>%
  filter(!is.na(valor)) %>%
  group_by(event_name, variable, valor) %>%
  summarise(n = n(), .groups = "drop_last") %>%
  mutate(pct = n / sum(n) * 100) %>%
  ungroup() %>%
  mutate(resumen = sprintf("%s: %d (%.1f%%)", valor, n, pct)) %>%
  group_by(event_name, variable) %>%
  summarise(resumen = paste(resumen, collapse = "; "), .groups = "drop")  # Junta todos los niveles



# Crear tabla pivotada
tabla_final1 <- bind_rows(res_num1, res_cat1) %>%
  pivot_wider(names_from = event_name, values_from = resumen)

# Orden y nombres bonitos
orden_filas1 <- c("frecuencia_367", "pr", "qrs", "qtc", "grosor_de_la_pared_del_septo_interventricular_mm", "grosor_de_la_pared_posterior_mm", "dimension_diastolica_interna_del_ventriculo_izquierdo_mm", "dimension_sistolica_interna_del_ventriculo_izquierdo_mm", "indice_de_masa_ventriculo_izquierdo_g_m2","fraccion_de_eyeccon_ventriculo_izquierdo_percent","electrocardiograma", "ecocardiograma")

nombres_bonitos1 <- c(
  "frecuencia_367" = "Frecuencia",
  "pr" = "PR",
  "qrs" = "QRS",
  "qtc" = "QTC",
  "grosor_de_la_pared_del_septo_interventricular_mm" = "Grosor Pared septo interventricular (mm)",
  "grosor_de_la_pared_posterior_mm" = "Grosor pared posterior (mm)",
  "dimension_diastolica_interna_del_ventriculo_izquierdo_mm" = "Dim. diastolica int. ventriculo izq. (mm)",
  "dimension_sistolica_interna_del_ventriculo_izquierdo_mm" = "Dim. sistolica int.ventriculo izq. (mm)",
  "indice_de_masa_ventriculo_izquierdo_g_m2" = "indice masa ventriculo izquierdo",
  "fraccion_de_eyeccon_ventriculo_izquierdo_percent" = "frac. eyec. ventriculo izquierdo %",
  "electrocardiograma" = "Electrocardiograma", 
  "ecocardiograma" = "Ecocardiograma")


tabla_final1 <- tabla_final1 %>%
  mutate(variable = factor(variable, levels = orden_filas1)) %>%
  arrange(variable) %>%
  mutate(variable = nombres_bonitos1[as.character(variable)])


# Calcular n por evento
n_eventos1 <- df_long %>%
  group_by(event_name) %>%
  summarise(n = n_distinct(Record_ID1))


# Crear tabla GT estilo gtsummary
gt_examen1 <- tabla_final1 %>%
  gt() %>%
  # TÍTULO PRINCIPAL
  tab_header(
    title = md("** Evolución variables función cardíaca**")
  ) %>%
  cols_label(
    variable = "**Característica**",
    `Visita de inicio/Ciclo 1` = md(titulo_inicio),
    `Ciclo 2` = md(titulo_c2),
    `Visita de finalización` = md(titulo_final)
  ) %>%
  tab_style(
    style = cell_text(weight = "bold"),
    locations = cells_column_labels()
  ) %>%
  tab_style(
    style = cell_borders(sides = "bottom", weight = px(2)),
    locations = cells_column_labels()
  ) %>%
  tab_style(
    style = cell_borders(sides = "top", weight = px(2)),
    locations = cells_body(rows = 1)
  ) %>%
  tab_style(
    style = cell_text(align = "left"),
    locations = cells_body(columns = variable)
  ) %>%
  tab_style(
    style = cell_text(align = "center"),
    locations = cells_body(columns = -variable)
  ) %>%
  # Estilo del título
  tab_style(
    style = cell_text(
      weight = "bold",
      size = px(14),
      align = "left"
    ),
    locations = cells_title(groups = "title")
  ) %>%
  tab_options(
    table.font.names = "Arial",
    table.font.size = px(12),
    data_row.padding = px(5),
    table.border.top.style = "hidden",
    table.border.bottom.style = "solid",
    table.border.bottom.width = px(2),
    column_labels.border.bottom.width = px(2),
    column_labels.border.top.width = px(2),
    heading.align = "left"
  ) %>%
  tab_footnote(
    footnote = "Media (DE) para variables continuas; Moda: n (%) para variables categóricas",
    locations = cells_column_labels(columns = variable)
  )

gt_examen1
** Evolución variables función cardíaca**
**Característica**1 Ciclo 1
N = 24
Ciclo 2
N = 20
Finalización
N = 23
Frecuencia 75.4 (12.7) 74.8 (14.7) 72.1 (13.4)
PR 139.6 (21.8) 137.2 (15.9) 150.7 (15.1)
QRS 93.8 (9.7) 97.4 (11.9) 94.8 (10.7)
QTC 426.9 (31.5) 448.6 (26.5) 853.5 (1288.5)
Grosor Pared septo interventricular (mm) 8.4 (1.8) 7.9 (2.4) 15.4 (21.0)
Grosor pared posterior (mm) 7.8 (1.4) 8.0 (1.6) 8.2 (2.1)
Dim. diastolica int. ventriculo izq. (mm) 46.4 (9.1) 45.5 (6.2) 44.5 (6.7)
Dim. sistolica int.ventriculo izq. (mm) 28.7 (5.5) 32.2 (3.8) 28.4 (4.5)
indice masa ventriculo izquierdo 73.5 (23.2) 847.3 (2466.2) 73.9 (19.8)
frac. eyec. ventriculo izquierdo % 60.2 (5.6) 56.9 (3.4) 59.0 (4.0)
Electrocardiograma Anormal: 7 (53.8%); Normal: 6 (46.2%) Anormal: 5 (50.0%); Normal: 5 (50.0%) Anormal: 2 (20.0%); Normal: 8 (80.0%)
Ecocardiograma Anormal clínicamente no significativo: 10 (83.3%); Normal clínicamente significativo: 2 (16.7%) Anormal clínicamente no significativo: 8 (80.0%); Normal clínicamente significativo: 2 (20.0%) Anormal clínicamente no significativo: 7 (70.0%); Normal clínicamente significativo: 3 (30.0%)
1 Media (DE) para variables continuas; Moda: n (%) para variables categóricas

Laboratorio de seguridad

Ver código
# Selección de variables
vars_numericas2 <- c("trigliceridos_en_mg_d_l", "colesterol_total_en_mg_d_l", "hdl_en_mg_d_l", "ldl_en_mg_d_l", "fosfatasa_alcalina_u_l", "ast_u_l", "alt_u_l", "bilirrubina_total_en_mg_d_l", "bilirrubina_directa_en_mg_d_l", "bilirrubina_total_en_mg_d_l", "nitrogeno_ureico_en_sangre_bun_en_mg_d_l", "creatinina_serica_en_mg_d_l",  "acido_urico_en_mg_d_l", "lactato_deshidrogenasa_ldh_u_l", "ferritina_en_ng_ml", "albumina_en_g_d_l", "hierro_en_ug_dl", "recuento_total_de_eritrocitos_u_l", "recuento_plaquetas_u_l", "hemoglobina_en_gr_d_l", "hematocrito_percent", "recuento_total_de_leucocitos_u_l", "neutrofilos_valor_absoluto_u_l", "neutrofilos_percent", "linfocitos_valor_absoluto_u_l", "linfocitos_percent", "eosinofilos_valor_absoluto_u_l", "eosinofilos_percent",  "basofilos_valor_absoluto_u_l", "basofilos_percent", "monocitos_valor_absoluto_u_l", "monocitos_percent", "glicemia_en_mg_d_l",  "sodio_en_mmol_l","calcio_en_mg_dl",  "potasio_en_mmol_l", "magnesio_en_mg_dl" )

vars_categoricas2 <- c("analisis_de_orina")


# Limpiar y convertir variables categóricas
df_long <- df_long %>%
  mutate(across(all_of(vars_categoricas2), ~ {
    case_when(
      . %in% c("", " ", NA) ~ NA_character_,
      TRUE ~ trimws(.)
    )
  })) %>%
  mutate(across(all_of(vars_categoricas2), as.factor)) %>%
  mutate(event_name = factor(event_name, levels = momentos_analisis))


# Calcular resúmenes numéricos
res_num2 <- df_long %>%
  select(event_name, all_of(vars_numericas2)) %>%
  pivot_longer(-event_name, names_to = "variable", values_to = "valor") %>%
  group_by(event_name, variable) %>%
  summarise(
    resumen = sprintf("%.1f (%.1f)", mean(valor, na.rm = TRUE), sd(valor, na.rm = TRUE)),
    .groups = "drop"
  )

res_cat2 <- df_long %>%
  select(event_name, all_of(vars_categoricas2)) %>%
  pivot_longer(-event_name, names_to = "variable", values_to = "valor") %>%
  filter(!is.na(valor)) %>%
  group_by(event_name, variable, valor) %>%
  summarise(n = n(), .groups = "drop_last") %>%
  mutate(pct = n / sum(n) * 100) %>%
  ungroup() %>%
  mutate(resumen = sprintf("%s: %d (%.1f%%)", valor, n, pct)) %>%
  group_by(event_name, variable) %>%
  summarise(resumen = paste(resumen, collapse = "; "), .groups = "drop")  # Junta todos los niveles


# Crear tabla pivotada
tabla_final2 <- bind_rows(res_num2, res_cat2) %>%
  pivot_wider(names_from = event_name, values_from = resumen)

# Orden y nombres bonitos
orden_filas2 <- c("analisis_de_orina", "trigliceridos_en_mg_d_l", "colesterol_total_en_mg_d_l", "hdl_en_mg_d_l", "ldl_en_mg_d_l", "fosfatasa_alcalina_u_l", "ast_u_l", "alt_u_l", "bilirrubina_total_en_mg_d_l", "bilirrubina_directa_en_mg_d_l", "bilirrubina_indirecta_en_mg_d_l", "nitrogeno_ureico_en_sangre_bun_en_mg_d_l", "creatinina_serica_en_mg_d_l",  "acido_urico_en_mg_d_l", "lactato_deshidrogenasa_ldh_u_l", "ferritina_en_ng_ml", "albumina_en_g_d_l", "hierro_en_ug_dl", "recuento_total_de_eritrocitos_u_l", "recuento_plaquetas_u_l", "hemoglobina_en_gr_d_l", "hematocrito_percent", "recuento_total_de_leucocitos_u_l", "neutrofilos_valor_absoluto_u_l", "neutrofilos_percent", "linfocitos_valor_absoluto_u_l", "linfocitos_percent", "eosinofilos_valor_absoluto_u_l", "eosinofilos_percent",  "basofilos_valor_absoluto_u_l", "basofilos_percent", "monocitos_valor_absoluto_u_l", "monocitos_percent", "glicemia_en_mg_d_l", "sodio_en_mmol_l","calcio_en_mg_dl",  "potasio_en_mmol_l", "magnesio_en_mg_dl" )


nombres_bonitos2 <- c(
  "analisis_de_orina" = "Análisis Orina",
  "trigliceridos_en_mg_d_l" = "Trigliceridos (mg/dL)", "colesterol_total_en_mg_d_l"= "Colesterol (mg/dL)",
  "hdl_en_mg_d_l" = "hdl (mg/dL)",
  "ldl_en_mg_d_l" = "ldl (mg/dL)",
  "fosfatasa_alcalina_u_l" = "fosfata alcalina (U/L)",
  "ast_u_l" = "ast (U/L)",
  "alt_u_l" = "alt (U/L)",
  "bilirrubina_total_en_mg_d_l" = "bilirrubina total (mg/dL)",  "bilirrubina_directa_en_mg_d_l" = "bilirrubina directa (mg/dL)", "bilirrubina_indirecta_en_mg_d_l" = "bilirrubina indirecta (mg/dL)", "nitrogeno_ureico_en_sangre_bun_en_mg_d_l" = "nitrogeno ureico (mg/dL)", "creatinina_serica_en_mg_d_l" = "creatinina serica (mg/dL)", "acido_urico_en_mg_d_l" = "acido urico (mg/dL)",  "lactato_deshidrogenasa_ldh_u_l" = "lactato deshidrogenasa (U/L)",
"ferritina_en_ng_ml" = "ferratina (ng/dL)",
"albumina_en_g_d_l" = "albumia (g/dL)",
"hierro_en_ug_dl" = "hierro (ug/dL)",
"recuento_total_de_eritrocitos_u_l" = "recuento total eitrocitos (U/L)", "recuento_plaquetas_u_l" = "recuento plaquetas (U/L)",
"hemoglobina_en_gr_d_l" = "hemoglobina en (gr/dL)",
"hematocrito_percent" = "hematrocito %",
"recuento_total_de_leucocitos_u_l" = "recuento total leucocito (U/L)", "neutrofilos_valor_absoluto_u_l" = "netrofilos V. abs (U/L)",
"neutrofilos_percent" = "neutrofilos %",
"linfocitos_valor_absoluto_u_l" = "linfocitos v. abs (U/L)", 
"linfocitos_percent" = "linfocitos %", 
"eosinofilos_valor_absoluto_u_l" = "eosinofilos v. abs", "eosinofilos_percent" = "eosinofilos %",  
"basofilos_valor_absoluto_u_l" = "basofilos v. abs (U/L)", "basofilos_percent" = "basofilos %", 
"monocitos_valor_absoluto_u_l" = "monocitos v. abs (U/L)",
"monocitos_percent" = "monocitos %", 
"glicemia_en_mg_d_l" = "glicemia (mg/dL)",
"sodio_en_mmol_l" = "sodio (mmol/L)",
"calcio_en_mg_dl" = "calcio (mg/dL)", 
"potasio_en_mmol_l" = "potasio (mmol/L)",
"magnesio_en_mg_dl" = "magnesio (mg/dL)")


tabla_final2 <- tabla_final2 %>%
  mutate(variable = factor(variable, levels = orden_filas2)) %>%
  arrange(variable) %>%
  mutate(variable = nombres_bonitos2[as.character(variable)])


# Calcular n por evento
n_eventos2 <- df_long %>%
  group_by(event_name) %>%
  summarise(n = n_distinct(Record_ID1))


# Crear tabla GT estilo gtsummary
gt_examen2 <- tabla_final2 %>%
  gt() %>%
  # TÍTULO PRINCIPAL
  tab_header(
    title = md("** Evolución variables examen laboratorio**")
  ) %>%
  cols_label(
    variable = "**Característica**",
    `Visita de inicio/Ciclo 1` = md(titulo_inicio),
    `Ciclo 2` = md(titulo_c2),
    `Visita de finalización` = md(titulo_final)
  ) %>%
  tab_style(
    style = cell_text(weight = "bold"),
    locations = cells_column_labels()
  ) %>%
  tab_style(
    style = cell_borders(sides = "bottom", weight = px(2)),
    locations = cells_column_labels()
  ) %>%
  tab_style(
    style = cell_borders(sides = "top", weight = px(2)),
    locations = cells_body(rows = 1)
  ) %>%
  tab_style(
    style = cell_text(align = "left"),
    locations = cells_body(columns = variable)
  ) %>%
  tab_style(
    style = cell_text(align = "center"),
    locations = cells_body(columns = -variable)
  ) %>%
  # Estilo del título
  tab_style(
    style = cell_text(
      weight = "bold",
      size = px(14),
      align = "left"
    ),
    locations = cells_title(groups = "title")
  ) %>%
  tab_options(
    table.font.names = "Arial",
    table.font.size = px(12),
    data_row.padding = px(5),
    table.border.top.style = "hidden",
    table.border.bottom.style = "solid",
    table.border.bottom.width = px(2),
    column_labels.border.bottom.width = px(2),
    column_labels.border.top.width = px(2),
    heading.align = "left"
  ) %>%
  tab_footnote(
    footnote = "Media (DE) para variables continuas; Moda: n (%) para variables categóricas",
    locations = cells_column_labels(columns = variable)
  )

gt_examen2
** Evolución variables examen laboratorio**
**Característica**1 Ciclo 1
N = 24
Ciclo 2
N = 20
Finalización
N = 23
Análisis Orina Anormal: 12 (52.2%); Normal: 11 (47.8%) Anormal: 9 (56.2%); Normal: 7 (43.8%) Anormal: 12 (70.6%); Normal: 5 (29.4%)
Trigliceridos (mg/dL) 146.2 (71.1) 118.7 (46.3) 150.1 (85.0)
Colesterol (mg/dL) 152.1 (34.3) 156.5 (49.8) 163.1 (43.6)
hdl (mg/dL) 38.8 (17.2) 38.2 (14.2) 42.4 (18.3)
ldl (mg/dL) 85.4 (24.4) 95.3 (43.5) 90.7 (37.9)
fosfata alcalina (U/L) 177.9 (141.0) 150.6 (88.8) 154.1 (74.7)
ast (U/L) 25.2 (9.0) 34.9 (26.1) 37.0 (53.6)
alt (U/L) 28.0 (21.4) 46.2 (48.4) 40.3 (56.9)
bilirrubina total (mg/dL) 0.6 (0.3) 0.8 (0.5) 0.7 (0.4)
bilirrubina directa (mg/dL) 0.2 (0.1) 0.3 (0.2) 0.3 (0.2)
nitrogeno ureico (mg/dL) 17.7 (10.5) 13.6 (5.0) 14.1 (4.5)
creatinina serica (mg/dL) 0.7 (0.2) 0.7 (0.1) 0.7 (0.2)
acido urico (mg/dL) 3.7 (1.1) 3.5 (1.2) 5.2 (2.0)
lactato deshidrogenasa (U/L) 557.0 (897.4) 293.5 (215.5) 241.6 (142.9)
ferratina (ng/dL) 3246.5 (5803.4) 3833.2 (4749.2) 6306.4 (10316.6)
albumia (g/dL) 3.7 (0.5) 3.5 (0.6) 3.7 (0.7)
hierro (ug/dL) 125.4 (100.4) 105.0 (80.4) 84.4 (56.5)
recuento total eitrocitos (U/L) 5953846.2 (9684481.2) 3265000.0 (948639.4) 3705000.0 (983387.0)
recuento plaquetas (U/L) 161215.4 (161283.9) 129040.0 (171572.3) 207950.0 (134865.1)
hemoglobina en (gr/dL) 9.8 (2.8) 9.5 (2.1) 11.0 (2.8)
hematrocito % 29.5 (8.7) 28.8 (7.5) 33.2 (8.6)
recuento total leucocito (U/L) 5141.2 (3257.2) 2687.0 (2293.1) 4360.0 (2527.4)
netrofilos V. abs (U/L) 2371.6 (2423.4) 1101.0 (1414.2) 3042.0 (2512.5)
neutrofilos % 39.4 (26.9) 35.5 (25.9) 65.0 (25.9)
linfocitos v. abs (U/L) 2004.1 (2042.5) 1255.0 (1653.0) 975.0 (673.0)
linfocitos % 43.9 (26.5) 53.2 (29.5) 26.9 (27.0)
eosinofilos v. abs 83.8 (166.8) 32.0 (47.3) 55.0 (52.1)
eosinofilos % 1.5 (2.0) 1.2 (1.7) 1.5 (1.1)
basofilos v. abs (U/L) 123.8 (385.2) 14.0 (31.7) 8.0 (13.2)
basofilos % 1.7 (4.9) 0.3 (0.5) 0.4 (0.5)
monocitos v. abs (U/L) 634.6 (877.9) 247.0 (271.9) 259.0 (183.8)
monocitos % 12.0 (11.6) 9.2 (8.8) 5.9 (4.3)
glicemia (mg/dL) 110.7 (34.8) 100.5 (14.8) 95.4 (10.4)
sodio (mmol/L) 136.6 (2.9) 139.2 (1.9) 139.0 (3.3)
calcio (mg/dL) 8.8 (0.5) 8.8 (0.8) 9.1 (0.8)
potasio (mmol/L) 4.2 (0.5) 4.3 (0.3) 4.0 (0.4)
magnesio (mg/dL) 2.0 (0.4) 2.0 (0.1) 2.0 (0.2)
1 Media (DE) para variables continuas; Moda: n (%) para variables categóricas

Segregando por tipo de cáncer

Primero se alista la base de datos

Ver código
df_diag <- datos_f %>%
  filter(event_name == "Visita de tamizaje") %>%
  select(Record_ID1, diagnostico_del_paciente_10) %>% 
  distinct()  

colnames(df_diag)[2] <- "DIAGF"

df_long <- df_long %>%
  left_join(df_diag, by = "Record_ID1")


#Se recodifica el tipo de cáncer 

df_long <- df_long %>%
  mutate(
    TIPO_DX = case_when(
      DIAGF %in% c(
        "Cáncer de Colón",
        "Cáncer de Estómago",
        "Cáncer de Páncreas",
        "Cáncer de Vias Biliares"
      ) ~ "Cancer_Gastrico",

      DIAGF %in% c(
        "Leucemia Linfoide Aguda Nuevo dx",
        "Leucemia Linfoide Aguda Recaída",
        "Leucemia Mieloide Aguda Nuevo dx",
        "Leucemia Mieloide Aguda Recaída"
      ) ~ "Leucemias",

      TRUE ~ DIAGF
    )
  )

df_long_gastrico <-  df_long %>% filter(TIPO_DX == "Cancer_Gastrico")
df_long_leucemias <-  df_long %>% filter(TIPO_DX == "Leucemias")

Evolución variables por diagnóstico

Ver código
res_num3 <- df_long_gastrico %>%
  select(event_name, all_of(vars_numericas)) %>%
  pivot_longer(-event_name, names_to = "variable", values_to = "valor") %>%
  group_by(event_name, variable) %>%
  summarise(
    resumen = sprintf("%.1f (%.1f)", mean(valor, na.rm = TRUE), sd(valor, na.rm = TRUE)),
    .groups = "drop"
  )

# Calcular resúmenes categóricos (moda)
res_cat3 <- df_long_gastrico %>%
  select(event_name, all_of(vars_categoricas)) %>%
  pivot_longer(-event_name, names_to = "variable", values_to = "valor") %>%
  filter(!is.na(valor)) %>%
  group_by(event_name, variable, valor) %>%
  summarise(n = n(), .groups = "drop_last") %>%
  mutate(pct = n / sum(n) * 100) %>%
  ungroup() %>%
  mutate(resumen = sprintf("%s: %d (%.1f%%)", valor, n, pct)) %>%
  group_by(event_name, variable) %>%
  summarise(resumen = paste(resumen, collapse = "; "), .groups = "drop")  # Junta todos los niveles



tabla_final3 <- bind_rows(res_num3, res_cat3) %>%
  pivot_wider(names_from = event_name, values_from = resumen)


tabla_final3 <- tabla_final3 %>%
  mutate(variable = factor(variable, levels = orden_filas)) %>%
  arrange(variable) %>%
  mutate(variable = nombres_bonitos[as.character(variable)])

n_eventos3 <- df_long_gastrico %>%
  group_by(event_name) %>%
  summarise(n = n_distinct(Record_ID1))

# Crear títulos de columnas
titulo_iniciox <- paste0("**Ciclo 1**<br>N = ",                       n_eventos3$n[n_eventos3$event_name == "Visita de inicio/Ciclo 1"])

titulo_c2x <- paste0("**Ciclo 2**<br>N = ",                     n_eventos3$n[n_eventos3$event_name == "Ciclo 2"])

titulo_finalx <- paste0("**Finalización**<br>N = ",                        n_eventos3$n[n_eventos3$event_name == "Visita de finalización"])


# Crear tabla GT estilo gtsummary
gt_examen3 <- tabla_final3 %>%
  gt() %>%
  # TÍTULO PRINCIPAL
  tab_header(
    title = md("** Evolución variables exámen físico  - signos vitales por momento CANCER GASTRICO**")
  ) %>%
  cols_label(
    variable = "**Característica**",
    `Visita de inicio/Ciclo 1` = md(titulo_iniciox),
    `Ciclo 2` = md(titulo_c2x),
    `Visita de finalización` = md(titulo_finalx)
  ) %>%
  tab_style(
    style = cell_text(weight = "bold"),
    locations = cells_column_labels()
  ) %>%
  tab_style(
    style = cell_borders(sides = "bottom", weight = px(2)),
    locations = cells_column_labels()
  ) %>%
  tab_style(
    style = cell_borders(sides = "top", weight = px(2)),
    locations = cells_body(rows = 1)
  ) %>%
  tab_style(
    style = cell_text(align = "left"),
    locations = cells_body(columns = variable)
  ) %>%
  tab_style(
    style = cell_text(align = "center"),
    locations = cells_body(columns = -variable)
  ) %>%
  # Estilo del título
  tab_style(
    style = cell_text(
      weight = "bold",
      size = px(14),
      align = "left"
    ),
    locations = cells_title(groups = "title")
  ) %>%
  tab_options(
    table.font.names = "Arial",
    table.font.size = px(12),
    data_row.padding = px(5),
    table.border.top.style = "hidden",
    table.border.bottom.style = "solid",
    table.border.bottom.width = px(2),
    column_labels.border.bottom.width = px(2),
    column_labels.border.top.width = px(2),
    heading.align = "left"
  ) %>%
  tab_footnote(
    footnote = "Media (DE) para variables continuas; Moda: n (%) para variables categóricas",
    locations = cells_column_labels(columns = variable)
  )


###Leucemias



res_num4 <- df_long_leucemias %>%
  select(event_name, all_of(vars_numericas)) %>%
  pivot_longer(-event_name, names_to = "variable", values_to = "valor") %>%
  group_by(event_name, variable) %>%
  summarise(
    resumen = sprintf("%.1f (%.1f)", mean(valor, na.rm = TRUE), sd(valor, na.rm = TRUE)),
    .groups = "drop"
  )

# Calcular resúmenes categóricos (moda)
res_cat4 <- df_long_leucemias %>%
  select(event_name, all_of(vars_categoricas)) %>%
  pivot_longer(-event_name, names_to = "variable", values_to = "valor") %>%
  filter(!is.na(valor)) %>%
  group_by(event_name, variable, valor) %>%
  summarise(n = n(), .groups = "drop_last") %>%
  mutate(pct = n / sum(n) * 100) %>%
  ungroup() %>%
  mutate(resumen = sprintf("%s: %d (%.1f%%)", valor, n, pct)) %>%
  group_by(event_name, variable) %>%
  summarise(resumen = paste(resumen, collapse = "; "), .groups = "drop")  # Junta todos los niveles


tabla_final4 <- bind_rows(res_num4, res_cat4) %>%
  pivot_wider(names_from = event_name, values_from = resumen)


tabla_final4 <- tabla_final4 %>%
  mutate(variable = factor(variable, levels = orden_filas)) %>%
  arrange(variable) %>%
  mutate(variable = nombres_bonitos[as.character(variable)])

n_eventos4 <- df_long_leucemias %>%
  group_by(event_name) %>%
  summarise(n = n_distinct(Record_ID1))

# Crear títulos de columnas
titulo_inicioy <- paste0("**Ciclo 1**<br>N = ",                       n_eventos4$n[n_eventos4$event_name == "Visita de inicio/Ciclo 1"])

titulo_c2y <- paste0("**Ciclo 2**<br>N = ",                     n_eventos4$n[n_eventos4$event_name == "Ciclo 2"])

titulo_finaly <- paste0("**Finalización**<br>N = ",                        n_eventos4$n[n_eventos4$event_name == "Visita de finalización"])

# Crear tabla GT estilo gtsummary
gt_examen4 <- tabla_final4 %>%
  gt() %>%
  # TÍTULO PRINCIPAL
  tab_header(
    title = md("** Evolución variables exámen físico  - signos vitales por momento  LEUCEMIAS**")
  ) %>%
  cols_label(
    variable = "**Característica**",
    `Visita de inicio/Ciclo 1` = md(titulo_inicioy),
    `Ciclo 2` = md(titulo_c2y),
    `Visita de finalización` = md(titulo_finaly)
  ) %>%
  tab_style(
    style = cell_text(weight = "bold"),
    locations = cells_column_labels()
  ) %>%
  tab_style(
    style = cell_borders(sides = "bottom", weight = px(2)),
    locations = cells_column_labels()
  ) %>%
  tab_style(
    style = cell_borders(sides = "top", weight = px(2)),
    locations = cells_body(rows = 1)
  ) %>%
  tab_style(
    style = cell_text(align = "left"),
    locations = cells_body(columns = variable)
  ) %>%
  tab_style(
    style = cell_text(align = "center"),
    locations = cells_body(columns = -variable)
  ) %>%
  # Estilo del título
  tab_style(
    style = cell_text(
      weight = "bold",
      size = px(14),
      align = "left"
    ),
    locations = cells_title(groups = "title")
  ) %>%
  tab_options(
    table.font.names = "Arial",
    table.font.size = px(12),
    data_row.padding = px(5),
    table.border.top.style = "hidden",
    table.border.bottom.style = "solid",
    table.border.bottom.width = px(2),
    column_labels.border.bottom.width = px(2),
    column_labels.border.top.width = px(2),
    heading.align = "left"
  ) %>%
  tab_footnote(
    footnote = "Media (DE) para variables continuas; Moda: n (%) para variables categóricas",
    locations = cells_column_labels(columns = variable)
  )

library(htmltools)

tablas_juntas <- tagList(
  gt_examen3,
  htmltools::br(), htmltools::br(),  # doble salto de línea
  gt_examen4
)

tablas_juntas
** Evolución variables exámen físico - signos vitales por momento CANCER GASTRICO**
**Característica**1 Ciclo 1
N = 9
Ciclo 2
N = 6
Finalización
N = 8
Peso (kg) 46.0 (10.3) 48.6 (12.1) 48.4 (12.2)
Presión sistólica (mmHg) 106.4 (14.0) 116.2 (20.7) 112.5 (16.4)
Presión diastólica (mmHg) 64.9 (6.9) 72.5 (14.6) 61.7 (23.2)
Frecuencia cardiaca (l/min) 80.6 (14.4) 82.8 (15.4) 77.7 (12.1)
Cabeza y cuello Anormal: 1 (11.1%); Normal: 8 (88.9%) Normal: 6 (100.0%) Normal: 6 (100.0%)
Cardiovascular Anormal: 2 (22.2%); Normal: 7 (77.8%) Anormal: 1 (16.7%); Normal: 5 (83.3%) Anormal: 1 (16.7%); Normal: 5 (83.3%)
Pulmonar Anormal: 2 (22.2%); Normal: 7 (77.8%) Anormal: 4 (66.7%); Normal: 2 (33.3%) Anormal: 5 (83.3%); Normal: 1 (16.7%)
Abdomen Anormal: 7 (77.8%); Normal: 2 (22.2%) Anormal: 4 (66.7%); Normal: 2 (33.3%) Anormal: 5 (83.3%); Normal: 1 (16.7%)
Extremidades Anormal: 7 (77.8%); Normal: 2 (22.2%) Anormal: 4 (66.7%); Normal: 2 (33.3%) Anormal: 5 (83.3%); Normal: 1 (16.7%)
Neurológico Normal: 9 (100.0%) Normal: 6 (100.0%) Normal: 6 (100.0%)
1 Media (DE) para variables continuas; Moda: n (%) para variables categóricas


** Evolución variables exámen físico - signos vitales por momento LEUCEMIAS**
**Característica**1 Ciclo 1
N = 15
Ciclo 2
N = 14
Finalización
N = 15
Peso (kg) 65.5 (12.5) 63.7 (12.9) 65.2 (15.9)
Presión sistólica (mmHg) 108.9 (11.5) 106.5 (17.1) 103.2 (17.1)
Presión diastólica (mmHg) 66.8 (10.9) 66.4 (8.2) 59.6 (16.7)
Frecuencia cardiaca (l/min) 83.3 (11.9) 80.1 (8.5) 77.3 (16.4)
Cabeza y cuello Anormal: 3 (20.0%); Normal: 12 (80.0%) Anormal: 4 (33.3%); Normal: 8 (66.7%) Anormal: 3 (25.0%); Normal: 9 (75.0%)
Cardiovascular Anormal: 6 (40.0%); Normal: 9 (60.0%) Anormal: 4 (33.3%); Normal: 8 (66.7%) Anormal: 4 (33.3%); Normal: 8 (66.7%)
Pulmonar Anormal: 6 (40.0%); Normal: 9 (60.0%) Anormal: 5 (41.7%); Normal: 7 (58.3%) Anormal: 4 (33.3%); Normal: 8 (66.7%)
Abdomen Anormal: 5 (33.3%); Normal: 10 (66.7%) Anormal: 3 (25.0%); Normal: 9 (75.0%) Anormal: 5 (41.7%); Normal: 7 (58.3%)
Extremidades Anormal: 3 (20.0%); Normal: 12 (80.0%) Anormal: 5 (41.7%); Normal: 7 (58.3%) Anormal: 4 (33.3%); Normal: 8 (66.7%)
Neurológico Anormal: 2 (13.3%); Normal: 13 (86.7%) Anormal: 2 (16.7%); Normal: 10 (83.3%) Anormal: 1 (8.3%); Normal: 11 (91.7%)
1 Media (DE) para variables continuas; Moda: n (%) para variables categóricas
Ver código
res_num5 <- df_long_gastrico %>%
  select(event_name, all_of(vars_numericas1)) %>%
  pivot_longer(-event_name, names_to = "variable", values_to = "valor") %>%
  group_by(event_name, variable) %>%
  summarise(
    resumen = sprintf("%.1f (%.1f)", mean(valor, na.rm = TRUE), sd(valor, na.rm = TRUE)),
    .groups = "drop"
  )

# Calcular resúmenes categóricos (moda)
res_cat5 <- df_long_gastrico %>%
  select(event_name, all_of(vars_categoricas1)) %>%
  pivot_longer(-event_name, names_to = "variable", values_to = "valor") %>%
  filter(!is.na(valor)) %>%
  group_by(event_name, variable, valor) %>%
  summarise(n = n(), .groups = "drop_last") %>%
  mutate(pct = n / sum(n) * 100) %>%
  ungroup() %>%
  mutate(resumen = sprintf("%s: %d (%.1f%%)", valor, n, pct)) %>%
  group_by(event_name, variable) %>%
  summarise(resumen = paste(resumen, collapse = "; "), .groups = "drop")  # Junta todos los niveles

tabla_final5 <- bind_rows(res_num5, res_cat5) %>%
  pivot_wider(names_from = event_name, values_from = resumen)

tabla_final5 <- tabla_final5 %>%
  mutate(variable = factor(variable, levels = orden_filas1)) %>%
  arrange(variable) %>%
  mutate(variable = nombres_bonitos1[as.character(variable)])

gt_examen5 <- tabla_final5 %>%
  gt() %>%
  # TÍTULO PRINCIPAL
  tab_header(
    title = md("** Evolución variables función cardíaca Cancer Gastrico**")
  ) %>%
  cols_label(
    variable = "**Característica**",
    `Visita de inicio/Ciclo 1` = md(titulo_iniciox),
    `Ciclo 2` = md(titulo_c2x),
    `Visita de finalización` = md(titulo_finalx)
  ) %>%
  tab_style(
    style = cell_text(weight = "bold"),
    locations = cells_column_labels()
  ) %>%
  tab_style(
    style = cell_borders(sides = "bottom", weight = px(2)),
    locations = cells_column_labels()
  ) %>%
  tab_style(
    style = cell_borders(sides = "top", weight = px(2)),
    locations = cells_body(rows = 1)
  ) %>%
  tab_style(
    style = cell_text(align = "left"),
    locations = cells_body(columns = variable)
  ) %>%
  tab_style(
    style = cell_text(align = "center"),
    locations = cells_body(columns = -variable)
  ) %>%
  # Estilo del título
  tab_style(
    style = cell_text(
      weight = "bold",
      size = px(14),
      align = "left"
    ),
    locations = cells_title(groups = "title")
  ) %>%
  tab_options(
    table.font.names = "Arial",
    table.font.size = px(12),
    data_row.padding = px(5),
    table.border.top.style = "hidden",
    table.border.bottom.style = "solid",
    table.border.bottom.width = px(2),
    column_labels.border.bottom.width = px(2),
    column_labels.border.top.width = px(2),
    heading.align = "left"
  ) %>%
  tab_footnote(
    footnote = "Media (DE) para variables continuas; Moda: n (%) para variables categóricas",
    locations = cells_column_labels(columns = variable)
  )


#Leucemias

res_num6 <- df_long_leucemias %>%
  select(event_name, all_of(vars_numericas1)) %>%
  pivot_longer(-event_name, names_to = "variable", values_to = "valor") %>%
  group_by(event_name, variable) %>%
  summarise(
    resumen = sprintf("%.1f (%.1f)", mean(valor, na.rm = TRUE), sd(valor, na.rm = TRUE)),
    .groups = "drop"
  )

# Calcular resúmenes categóricos (moda)
res_cat6 <- df_long_leucemias %>%
  select(event_name, all_of(vars_categoricas1)) %>%
  pivot_longer(-event_name, names_to = "variable", values_to = "valor") %>%
  filter(!is.na(valor)) %>%
  group_by(event_name, variable, valor) %>%
  summarise(n = n(), .groups = "drop_last") %>%
  mutate(pct = n / sum(n) * 100) %>%
  ungroup() %>%
  mutate(resumen = sprintf("%s: %d (%.1f%%)", valor, n, pct)) %>%
  group_by(event_name, variable) %>%
  summarise(resumen = paste(resumen, collapse = "; "), .groups = "drop")  # Junta todos los niveles

tabla_final6 <- bind_rows(res_num6, res_cat6) %>%
  pivot_wider(names_from = event_name, values_from = resumen)

tabla_final6 <- tabla_final6 %>%
  mutate(variable = factor(variable, levels = orden_filas1)) %>%
  arrange(variable) %>%
  mutate(variable = nombres_bonitos1[as.character(variable)])

gt_examen6 <- tabla_final6 %>%
  gt() %>%
  # TÍTULO PRINCIPAL
  tab_header(
    title = md("** Evolución variables función cardíaca Leucemias**")
  ) %>%
  cols_label(
    variable = "**Característica**",
    `Visita de inicio/Ciclo 1` = md(titulo_inicioy),
    `Ciclo 2` = md(titulo_c2y),
    `Visita de finalización` = md(titulo_finaly)
  ) %>%
  tab_style(
    style = cell_text(weight = "bold"),
    locations = cells_column_labels()
  ) %>%
  tab_style(
    style = cell_borders(sides = "bottom", weight = px(2)),
    locations = cells_column_labels()
  ) %>%
  tab_style(
    style = cell_borders(sides = "top", weight = px(2)),
    locations = cells_body(rows = 1)
  ) %>%
  tab_style(
    style = cell_text(align = "left"),
    locations = cells_body(columns = variable)
  ) %>%
  tab_style(
    style = cell_text(align = "center"),
    locations = cells_body(columns = -variable)
  ) %>%
  # Estilo del título
  tab_style(
    style = cell_text(
      weight = "bold",
      size = px(14),
      align = "left"
    ),
    locations = cells_title(groups = "title")
  ) %>%
  tab_options(
    table.font.names = "Arial",
    table.font.size = px(12),
    data_row.padding = px(5),
    table.border.top.style = "hidden",
    table.border.bottom.style = "solid",
    table.border.bottom.width = px(2),
    column_labels.border.bottom.width = px(2),
    column_labels.border.top.width = px(2),
    heading.align = "left"
  ) %>%
  tab_footnote(
    footnote = "Media (DE) para variables continuas; Moda: n (%) para variables categóricas",
    locations = cells_column_labels(columns = variable)
  )

tablas_juntas1 <- tagList(
  gt_examen5,
  htmltools::br(), htmltools::br(),  # doble salto de línea
  gt_examen6
)

tablas_juntas1
** Evolución variables función cardíaca Cancer Gastrico**
**Característica**1 Ciclo 1
N = 9
Ciclo 2
N = 6
Finalización
N = 8
Frecuencia 73.8 (19.3) 74.3 (9.1) 70.5 (19.8)
PR 147.5 (24.2) 142.7 (20.0) 153.0 (20.9)
QRS 92.0 (11.0) 89.3 (8.3) 94.5 (12.2)
QTC 418.5 (41.5) 427.0 (4.4) 442.5 (21.7)
Grosor Pared septo interventricular (mm) 8.8 (2.2) 9.0 (4.0) 9.0 (2.2)
Grosor pared posterior (mm) 7.5 (1.9) 7.7 (2.1) 7.8 (2.2)
Dim. diastolica int. ventriculo izq. (mm) 39.8 (7.8) 44.7 (7.2) 41.2 (4.8)
Dim. sistolica int.ventriculo izq. (mm) 25.2 (5.0) 29.7 (2.5) 27.2 (3.9)
indice masa ventriculo izquierdo 64.2 (24.7) 74.0 (30.5) 70.8 (19.8)
frac. eyec. ventriculo izquierdo % 59.8 (6.9) 56.3 (3.2) 57.8 (5.0)
Electrocardiograma Anormal: 4 (100.0%) Normal: 3 (100.0%) Anormal: 1 (25.0%); Normal: 3 (75.0%)
Ecocardiograma Anormal clínicamente no significativo: 2 (50.0%); Normal clínicamente significativo: 2 (50.0%) Anormal clínicamente no significativo: 3 (100.0%) Anormal clínicamente no significativo: 2 (50.0%); Normal clínicamente significativo: 2 (50.0%)
1 Media (DE) para variables continuas; Moda: n (%) para variables categóricas


** Evolución variables función cardíaca Leucemias**
**Característica**1 Ciclo 1
N = 15
Ciclo 2
N = 14
Finalización
N = 15
Frecuencia 76.2 (9.5) 75.0 (17.2) 73.2 (9.1)
PR 135.6 (21.0) 134.9 (15.0) 148.8 (10.7)
QRS 94.8 (9.7) 100.9 (11.9) 95.0 (10.9)
QTC 431.1 (27.7) 457.9 (26.7) 1127.5 (1662.2)
Grosor Pared septo interventricular (mm) 8.2 (1.8) 7.4 (1.5) 19.7 (27.1)
Grosor pared posterior (mm) 8.0 (1.2) 8.1 (1.5) 8.5 (2.2)
Dim. diastolica int. ventriculo izq. (mm) 49.8 (8.2) 45.9 (6.3) 46.7 (7.3)
Dim. sistolica int.ventriculo izq. (mm) 30.4 (5.3) 33.3 (3.9) 29.2 (5.0)
indice masa ventriculo izquierdo 78.1 (22.6) 1178.7 (2948.9) 76.0 (21.4)
frac. eyec. ventriculo izquierdo % 60.4 (5.3) 57.1 (3.7) 59.8 (3.5)
Electrocardiograma Anormal: 3 (33.3%); Normal: 6 (66.7%) Anormal: 5 (71.4%); Normal: 2 (28.6%) Anormal: 1 (16.7%); Normal: 5 (83.3%)
Ecocardiograma Anormal clínicamente no significativo: 8 (100.0%) Anormal clínicamente no significativo: 5 (71.4%); Normal clínicamente significativo: 2 (28.6%) Anormal clínicamente no significativo: 5 (83.3%); Normal clínicamente significativo: 1 (16.7%)
1 Media (DE) para variables continuas; Moda: n (%) para variables categóricas
Ver código
res_num7 <- df_long_gastrico %>%
  select(event_name, all_of(vars_numericas2)) %>%
  pivot_longer(-event_name, names_to = "variable", values_to = "valor") %>%
  group_by(event_name, variable) %>%
  summarise(
    resumen = sprintf("%.1f (%.1f)", mean(valor, na.rm = TRUE), sd(valor, na.rm = TRUE)),
    .groups = "drop"
  )

res_cat7 <- df_long_gastrico %>%
  select(event_name, all_of(vars_categoricas2)) %>%
  pivot_longer(-event_name, names_to = "variable", values_to = "valor") %>%
  filter(!is.na(valor)) %>%
  group_by(event_name, variable, valor) %>%
  summarise(n = n(), .groups = "drop_last") %>%
  mutate(pct = n / sum(n) * 100) %>%
  ungroup() %>%
  mutate(resumen = sprintf("%s: %d (%.1f%%)", valor, n, pct)) %>%
  group_by(event_name, variable) %>%
  summarise(resumen = paste(resumen, collapse = "; "), .groups = "drop")  # Junta todos los niveles


tabla_final7 <- bind_rows(res_num7, res_cat7) %>%
  pivot_wider(names_from = event_name, values_from = resumen)


tabla_final7 <- tabla_final7 %>%
  mutate(variable = factor(variable, levels = orden_filas2)) %>%
  arrange(variable) %>%
  mutate(variable = nombres_bonitos2[as.character(variable)])


# Crear tabla GT estilo gtsummary
gt_examen7 <- tabla_final7 %>%
  gt() %>%
  # TÍTULO PRINCIPAL
  tab_header(
    title = md("** Evolución variables examen laboratorio cancer gastrico**")
  ) %>%
  cols_label(
    variable = "**Característica**",
    `Visita de inicio/Ciclo 1` = md(titulo_iniciox),
    `Ciclo 2` = md(titulo_c2x),
    `Visita de finalización` = md(titulo_finalx)
  ) %>%
  tab_style(
    style = cell_text(weight = "bold"),
    locations = cells_column_labels()
  ) %>%
  tab_style(
    style = cell_borders(sides = "bottom", weight = px(2)),
    locations = cells_column_labels()
  ) %>%
  tab_style(
    style = cell_borders(sides = "top", weight = px(2)),
    locations = cells_body(rows = 1)
  ) %>%
  tab_style(
    style = cell_text(align = "left"),
    locations = cells_body(columns = variable)
  ) %>%
  tab_style(
    style = cell_text(align = "center"),
    locations = cells_body(columns = -variable)
  ) %>%
  # Estilo del título
  tab_style(
    style = cell_text(
      weight = "bold",
      size = px(14),
      align = "left"
    ),
    locations = cells_title(groups = "title")
  ) %>%
  tab_options(
    table.font.names = "Arial",
    table.font.size = px(12),
    data_row.padding = px(5),
    table.border.top.style = "hidden",
    table.border.bottom.style = "solid",
    table.border.bottom.width = px(2),
    column_labels.border.bottom.width = px(2),
    column_labels.border.top.width = px(2),
    heading.align = "left"
  ) %>%
  tab_footnote(
    footnote = "Media (DE) para variables continuas; Moda: n (%) para variables categóricas",
    locations = cells_column_labels(columns = variable)
  )

#Leucemias

res_num8 <- df_long_leucemias %>%
  select(event_name, all_of(vars_numericas2)) %>%
  pivot_longer(-event_name, names_to = "variable", values_to = "valor") %>%
  group_by(event_name, variable) %>%
  summarise(
    resumen = sprintf("%.1f (%.1f)", mean(valor, na.rm = TRUE), sd(valor, na.rm = TRUE)),
    .groups = "drop"
  )

res_cat8 <- df_long_leucemias %>%
  select(event_name, all_of(vars_categoricas2)) %>%
  pivot_longer(-event_name, names_to = "variable", values_to = "valor") %>%
  filter(!is.na(valor)) %>%
  group_by(event_name, variable, valor) %>%
  summarise(n = n(), .groups = "drop_last") %>%
  mutate(pct = n / sum(n) * 100) %>%
  ungroup() %>%
  mutate(resumen = sprintf("%s: %d (%.1f%%)", valor, n, pct)) %>%
  group_by(event_name, variable) %>%
  summarise(resumen = paste(resumen, collapse = "; "), .groups = "drop")  # Junta todos los niveles


tabla_final8 <- bind_rows(res_num8, res_cat8) %>%
  pivot_wider(names_from = event_name, values_from = resumen)


tabla_final8 <- tabla_final8 %>%
  mutate(variable = factor(variable, levels = orden_filas2)) %>%
  arrange(variable) %>%
  mutate(variable = nombres_bonitos2[as.character(variable)])


# Crear tabla GT estilo gtsummary
gt_examen8 <- tabla_final8 %>%
  gt() %>%
  # TÍTULO PRINCIPAL
  tab_header(
    title = md("** Evolución variables examen laboratorio Leucemias**")
  ) %>%
  cols_label(
    variable = "**Característica**",
    `Visita de inicio/Ciclo 1` = md(titulo_inicioy),
    `Ciclo 2` = md(titulo_c2y),
    `Visita de finalización` = md(titulo_finaly)
  ) %>%
  tab_style(
    style = cell_text(weight = "bold"),
    locations = cells_column_labels()
  ) %>%
  tab_style(
    style = cell_borders(sides = "bottom", weight = px(2)),
    locations = cells_column_labels()
  ) %>%
  tab_style(
    style = cell_borders(sides = "top", weight = px(2)),
    locations = cells_body(rows = 1)
  ) %>%
  tab_style(
    style = cell_text(align = "left"),
    locations = cells_body(columns = variable)
  ) %>%
  tab_style(
    style = cell_text(align = "center"),
    locations = cells_body(columns = -variable)
  ) %>%
  # Estilo del título
  tab_style(
    style = cell_text(
      weight = "bold",
      size = px(14),
      align = "left"
    ),
    locations = cells_title(groups = "title")
  ) %>%
  tab_options(
    table.font.names = "Arial",
    table.font.size = px(12),
    data_row.padding = px(5),
    table.border.top.style = "hidden",
    table.border.bottom.style = "solid",
    table.border.bottom.width = px(2),
    column_labels.border.bottom.width = px(2),
    column_labels.border.top.width = px(2),
    heading.align = "left"
  ) %>%
  tab_footnote(
    footnote = "Media (DE) para variables continuas; Moda: n (%) para variables categóricas",
    locations = cells_column_labels(columns = variable)
  )

tablas_juntas2 <- tagList(
  gt_examen7,
  htmltools::br(), htmltools::br(),  # doble salto de línea
  gt_examen8
)

tablas_juntas2
** Evolución variables examen laboratorio cancer gastrico**
**Característica**1 Ciclo 1
N = 9
Ciclo 2
N = 6
Finalización
N = 8
Análisis Orina Anormal: 7 (77.8%); Normal: 2 (22.2%) Anormal: 4 (66.7%); Normal: 2 (33.3%) Anormal: 5 (83.3%); Normal: 1 (16.7%)
Trigliceridos (mg/dL) 107.5 (33.7) 121.3 (61.4) 117.1 (26.3)
Colesterol (mg/dL) 169.8 (18.8) 186.5 (51.8) 170.8 (55.2)
hdl (mg/dL) 54.3 (15.4) 53.0 (11.6) 54.3 (15.1)
ldl (mg/dL) 95.8 (18.8) 114.8 (54.0) 93.0 (42.6)
fosfata alcalina (U/L) 226.3 (187.7) 118.7 (44.9) 112.9 (15.0)
ast (U/L) 22.1 (8.3) 28.3 (10.4) 26.2 (12.2)
alt (U/L) 16.8 (8.7) 24.1 (11.3) 25.4 (26.4)
bilirrubina total (mg/dL) 0.5 (0.2) 0.4 (0.2) 0.5 (0.3)
bilirrubina directa (mg/dL) 0.2 (0.1) 0.2 (0.1) 0.2 (0.1)
nitrogeno ureico (mg/dL) 13.4 (4.6) 14.4 (6.7) 13.3 (5.7)
creatinina serica (mg/dL) 0.7 (0.2) 0.6 (0.1) 0.6 (0.1)
acido urico (mg/dL) 3.7 (0.9) 3.9 (0.5) 3.5 (0.3)
lactato deshidrogenasa (U/L) 173.0 (49.9) 206.1 (40.7) 231.5 (47.8)
ferratina (ng/dL) 307.2 (495.4) 26.0 (3.5) 81.2 (55.2)
albumia (g/dL) 3.8 (0.3) 4.1 (0.2) 3.9 (0.4)
hierro (ug/dL) 29.2 (7.4) 33.3 (8.7) 33.3 (13.1)
recuento total eitrocitos (U/L) 12600000.0 (16953465.7) 4230000.0 (1035229.4) 4122500.0 (811598.2)
recuento plaquetas (U/L) 325250.0 (145525.3) 233133.3 (32110.0) 263325.0 (129745.2)
hemoglobina en (gr/dL) 11.2 (1.8) 11.7 (2.0) 11.3 (1.4)
hematrocito % 34.2 (5.6) 36.2 (6.4) 34.6 (4.8)
recuento total leucocito (U/L) 5576.5 (4045.6) 4803.3 (1275.6) 5417.5 (3792.3)
netrofilos V. abs (U/L) 5225.0 (1646.0) 2996.7 (1054.1) 4100.0 (3688.7)
neutrofilos % 73.5 (6.0) 61.6 (6.5) 70.1 (12.9)
linfocitos v. abs (U/L) 1200.0 (216.0) 1090.0 (215.2) 870.0 (375.4)
linfocitos % 17.7 (5.6) 24.5 (9.9) 20.4 (11.2)
eosinofilos v. abs 75.0 (95.7) 100.0 (0.0) 55.0 (52.6)
eosinofilos % 1.5 (1.3) 1.9 (0.5) 1.4 (1.2)
basofilos v. abs (U/L) 50.0 (57.7) 43.3 (51.3) 7.5 (15.0)
basofilos % 0.8 (0.4) 0.9 (0.5) 0.6 (0.6)
monocitos v. abs (U/L) 450.0 (264.6) 523.3 (302.7) 360.0 (170.5)
monocitos % 6.5 (2.2) 10.8 (4.0) 7.4 (2.1)
glicemia (mg/dL) 94.8 (12.8) 85.6 (3.5) 94.0 (6.7)
sodio (mmol/L) 137.8 (1.9) 140.3 (1.5) 138.5 (4.0)
calcio (mg/dL) 8.6 (0.6) 8.7 (0.2) 9.1 (0.6)
potasio (mmol/L) 3.9 (0.4) 4.1 (0.4) 4.0 (0.5)
magnesio (mg/dL) 2.0 (0.1) 2.0 (0.1) 2.1 (0.2)
1 Media (DE) para variables continuas; Moda: n (%) para variables categóricas


** Evolución variables examen laboratorio Leucemias**
**Característica**1 Ciclo 1
N = 15
Ciclo 2
N = 14
Finalización
N = 15
Análisis Orina Anormal: 5 (35.7%); Normal: 9 (64.3%) Anormal: 5 (50.0%); Normal: 5 (50.0%) Anormal: 7 (63.6%); Normal: 4 (36.4%)
Trigliceridos (mg/dL) 171.2 (78.5) 117.3 (39.2) 168.1 (101.1)
Colesterol (mg/dL) 140.8 (37.6) 140.1 (42.3) 158.8 (38.3)
hdl (mg/dL) 28.8 (8.8) 30.2 (7.2) 35.8 (17.0)
ldl (mg/dL) 78.6 (25.7) 86.4 (37.3) 89.4 (37.3)
fosfata alcalina (U/L) 146.8 (96.5) 168.0 (103.3) 176.5 (85.1)
ast (U/L) 27.2 (9.2) 38.5 (31.5) 42.9 (66.5)
alt (U/L) 35.2 (24.1) 58.2 (56.8) 48.4 (68.0)
bilirrubina total (mg/dL) 0.7 (0.4) 1.0 (0.5) 0.8 (0.4)
bilirrubina directa (mg/dL) 0.3 (0.1) 0.3 (0.2) 0.3 (0.2)
nitrogeno ureico (mg/dL) 20.4 (12.3) 13.1 (4.2) 14.6 (3.9)
creatinina serica (mg/dL) 0.8 (0.2) 0.7 (0.2) 0.7 (0.2)
acido urico (mg/dL) 3.6 (1.3) 3.3 (1.3) 6.2 (1.9)
lactato deshidrogenasa (U/L) 727.7 (1049.1) 331.0 (252.2) 248.3 (187.8)
ferratina (ng/dL) 4716.1 (6739.0) 5464.8 (4845.6) 10456.5 (11828.1)
albumia (g/dL) 3.7 (0.6) 3.3 (0.5) 3.6 (0.9)
hierro (ug/dL) 168.2 (91.8) 135.7 (77.4) 118.4 (46.6)
recuento total eitrocitos (U/L) 3000000.0 (999862.5) 2851428.6 (572259.5) 3426666.7 (1055019.7)
recuento plaquetas (U/L) 88311.1 (107907.6) 84428.6 (189927.1) 171033.3 (136200.8)
hemoglobina en (gr/dL) 9.1 (3.1) 8.6 (1.5) 10.8 (3.6)
hematrocito % 27.4 (9.3) 25.6 (5.6) 32.2 (10.8)
recuento total leucocito (U/L) 4947.8 (3104.8) 1780.0 (2036.1) 3655.0 (1173.8)
netrofilos V. abs (U/L) 1103.4 (1383.3) 288.6 (250.5) 2336.7 (1306.3)
neutrofilos % 24.2 (15.2) 24.3 (22.5) 61.6 (32.8)
linfocitos v. abs (U/L) 2361.5 (2402.8) 1325.7 (2015.9) 1045.0 (846.2)
linfocitos % 55.5 (23.4) 65.5 (26.2) 31.2 (34.3)
eosinofilos v. abs 87.8 (195.6) 2.9 (7.6) 55.0 (56.8)
eosinofilos % 1.5 (2.4) 1.0 (2.0) 1.6 (1.0)
basofilos v. abs (U/L) 156.7 (466.3) 1.4 (3.8) 8.3 (13.3)
basofilos % 2.1 (5.9) 0.1 (0.3) 0.3 (0.4)
monocitos v. abs (U/L) 716.7 (1051.2) 128.6 (160.8) 191.7 (172.6)
monocitos % 14.5 (13.3) 8.6 (10.5) 4.9 (5.2)
glicemia (mg/dL) 117.8 (39.7) 106.9 (13.0) 96.3 (12.9)
sodio (mmol/L) 136.1 (3.2) 138.7 (2.0) 139.3 (3.0)
calcio (mg/dL) 8.8 (0.5) 8.8 (1.0) 9.2 (1.0)
potasio (mmol/L) 4.3 (0.5) 4.4 (0.3) 4.1 (0.4)
magnesio (mg/dL) 2.0 (0.4) 2.0 (0.2) 2.0 (0.2)
1 Media (DE) para variables continuas; Moda: n (%) para variables categóricas

Análisis de eventos de adversos

Se verificó los eventos adversos reportados por los pacientes cruzado por el momento de presentación

Ver código
df_AE <- datos_f %>%
  filter(event_name == "Evento adverso")


df_AE$nombre_del_evento_adverso <- df_AE$nombre_del_evento_adverso %>%
  stri_trans_general("Latin-ASCII") %>%  # quitar tildes
  tolower() %>%                          # minusculas
  gsub("[^a-z0-9 ]", " ", .) %>%         # quitar signos
  gsub("\\s+", " ", .) %>%               # espacios dobles
  trimws()

table(df_AE$nombre_del_evento_adverso) %>% 
  kable()
Var1 Freq
accidente cerebrovascular 1
alopecia 1
alteraciones del animo 1
alteraciones vasculares ateromatosis calcificada de segmentos intracraneales de las arterias carotidas internas 1
anemia 5
anorexia 2
apendicitis 1
apendicitis aguda 1
artralgias 1
artritis 1
ascitis 1
bacteremia 1
bacteriemia 1
bajo peso 1
bronquiolitis bacteriana 1
caida desde su propia altura 1
cefalea 2
cefalea origen oftalmologico 1
colitis 1
colitis neutropenica 2
constipacion 3
constipacion estrenimiento 1
contusion de muneca izquierda 1
derrame pericardico 1
derrame pleural minima cantidad de liquido pleural bilateral 1
deshidratacion 1
desordenes del sistema nervioso signos leves de atrofia cerebral cortical y central 1
diarrea 7
disminucion de conteo de linfocitos 1
disminucion de fraccion de eyeccion 1
disminucion de fraccion de eyeccion fevi 52 1
disminucion de la fraccion de eyeccion 1
disminucion de la fraccion de eyeccion descenso en 13 3 1
disminucion del recuento de linfocitos 1
disminucion del recuento de neutrofilos 1
disnea 2
dolor abdominal 7
dolor abdominal oncologico 1
dolor de cabeza 2
dolor en el pecho 1
dolor toracico de origen no cardiaco 1
edema 1
edema de miembros inferiores 1
edema pulmonar 1
elevacion de alt 5
elevacion de ast 4
elevacion de bilirrubinas 1
elevacion de creatinina 2
elevacion de deshidrogenasa lactica 2
elevacion de fosfatasa alcalina 2
elevacion de la fosfatasa alcalina 1
elevacion de lactato deshidrogenasa 1
emesis 2
enfermedad diarreica aguda de probable origen infeccioso 1
enterocolitis 1
epistaxis 3
escleritis anterior difusa ojo derecho 1
falla cardiaca 2
fatiga 1
fiebre 2
fiebre de origen tumoral 1
fistula gastrointestinal 1
fistula gastrointestinal enterocutanea vs progresion tumoral a pared abdominal 1
flebitis infecciosa tromboflebitis de vena basilica y vena cubital mediana del antebrazo derecho 1
fraccion de eyeccion disminuida 1
hematoma 1
hematoma intracraneana hematoma subdural 1
hemorragia conjuntival en ojos bilateral predominio derecho 1
hemorragia de vias digestivas altas 2
hemorragia uterina 1
hipercalcemia 1
hipercolesterolemia 1
hiperfosfatemia 1
hiperglucemia 1
hiperkalemia 1
hipertension arterial 1
hipertrigliceridemia 4
hipo singulto 1
hipoalbuminemia 2
hipocalcemia 3
hipokalemia 5
hipokalemia leve 1
hipomagnesemia 1
hiponatremia hiponatremia hipovolemica 1
hipotension 3
hipoxemia 2
incremento de lactato deshidrogenasa 1
infeccion asociada a cateter 1
infeccion bronquial 1
infeccion de la piel 1
infeccion de piel 1
infeccion de piel paniculitis con sobreinfeccion bacteriana neutropenia febril 1
infeccion de vias urinarias baja 1
infeccion pulmonar 2
infeccion respiratoria alta rinofaringitis viral 1
intervalo qt prolongado 1
linfopenia 1
magnesio bajo 2
mucositis 3
mucositis oral 4
nauseas 13
neumonia multilobar 1
neuropatia periferica sensitiva en miembros inferiores 1
neuropatia sensitiva 1
neutropenia febril 12
neutropenia febril bacteremia por k pneumoniae patron usual 1
neutropenia febril foco gastrointestinal 2
neutropenia febril foco respiratorio 1
neutropenia febril riesgo de candidiasis invasiva 1
ojo seco bilateral 1
orquiepididimitis 1
otalgia derecha 1
otras infecciones e infestaciones infeccion fungica invasiva de brecha 1
otras infecciones e infestaciones lavado bronco alveolar con evidencia de enterobacter cloacae complex y klebsiella oxytoca con patron de resistencia kpc sarm 1
otros desordenes cardiacos derrame pericardico minimo 1
otros desordenes cardiacos imagen con ecogenicidad de tejidos blandos de 5x2 mm altamente movil adherida a extremo distal de cateter central compatible con trombo vs vegetacion 1
palpitaciones 1
pancitopenia severa exacerbacion anemia y trombocitopenia 1
papiloma de la piel verrugas plantares 1
parestesias 1
perdida de peso 5
potasio bajo 3
progresion de la enfermedad 1
prolongacion del intervalo qt corregido 1
prurito 2
purpura humeda 1
queratitis epitelial 1
reaccion alergica 1
reaccion alergica asociaron con transfusion de plaquetas 1
reaccion de hipersensibilidad 1
recaida de leucemia aguda bifenotipica neoplasia benigna maligna o no especificada 1
recuento de neutrofilos disminuido neutropenia 1
retinopatia leucemica 1
rinosinusitis fungica alergica 1
sangrado gastrointestinal 1
sangrado oral 1
sepsis choque septico refractario 1
sindrome febril 1
sindrome mano pie 1
sobrecarga de hierro 1
sodio bajo 1
sospecha de dolor toracico cardiaco y coronario 1
sospecha de infeccion respiratoria 1
tos 1
trastorno hidroelectrolitico 1
trastorno hidroelectrolitico hipokalemia 2
trastorno hidroelectrolitico hipomagnasemia 1
trombocitopenia 2
trombocitopenia severa secundaria a leucemia mieloide aguda 1
tromboflebitis superficial tromboflebitis en miembro superior izquierdo 1
trombosis venosa profunda aguda 1
urticaria 1
vomito 1

Se intentó categorizar, pendiente por categorizar o verificar el análisis de esta información

Ver código
df_AE <- df_AE %>% 
  mutate(evento_agrupado = case_when(
    # Apendicitis
    grepl("apendicitis", nombre_del_evento_adverso) ~ "apendicitis",
    
    # Dolor abdominal
    grepl("dolor abdominal", nombre_del_evento_adverso) ~ "dolor abdominal",
    
    # Neutropenia febril
    grepl("neutropenia febril", nombre_del_evento_adverso) ~ "neutropenia febril",
    
    # Elevación de enzimas hepáticas
    grepl("elevacion de alt|elevacion de ast", nombre_del_evento_adverso) ~ "elevacion de transaminasas",
    
    # Colitis
    grepl("colitis", nombre_del_evento_adverso) ~ "colitis",
    
    # Hipokalemia
    grepl("hipokalemia|potasio bajo", nombre_del_evento_adverso) ~ "hipokalemia",
    
    # Hipocalcemia
    grepl("hipocalcemia", nombre_del_evento_adverso) ~ "hipocalcemia",
    
    # Mucositis
    grepl("mucositis", nombre_del_evento_adverso) ~ "mucositis",
    
    # Disminución de fracción de eyección
    grepl("disminucion de.*fraccion de eyeccion|fraccion de eyeccion disminuida", 
          nombre_del_evento_adverso) ~ "disminucion de fraccion de eyeccion",
    
    # Hemorragia digestiva
    grepl("hemorragia de vias digestivas|sangrado gastrointestinal", 
          nombre_del_evento_adverso) ~ "hemorragia digestiva",
    
    # Infección pulmonar/respiratoria
    grepl("infeccion pulmonar|infeccion respiratoria|infeccion bronquial|neumonia", 
          nombre_del_evento_adverso) ~ "infeccion respiratoria",
    
    # Trastorno hidroelectrolítico
    grepl("trastorno hidroelectrolitico", nombre_del_evento_adverso) ~ "trastorno hidroelectrolitico",
    
    # Elevación de fosfatasa alcalina
    grepl("elevacion de.*fosfatasa alcalina", nombre_del_evento_adverso) ~ "elevacion de fosfatasa alcalina",
    
    # Elevación de lactato deshidrogenasa
    grepl("elevacion de.*deshidrogenasa|incremento de lactato", 
          nombre_del_evento_adverso) ~ "elevacion de lactato deshidrogenasa",
    
    # Hipomagnesemia
    grepl("hipomagnesemia|magnesio bajo|hipomagnasemia", nombre_del_evento_adverso) ~ "hipomagnesemia",
    
    # Hiponatremia
    grepl("hiponatremia|sodio bajo", nombre_del_evento_adverso) ~ "hiponatremia",
    
    # Dolor de cabeza/cefalea
    grepl("cefalea|dolor de cabeza", nombre_del_evento_adverso) ~ "cefalea",
    
    # Constipación
    grepl("constipacion|estrenimiento", nombre_del_evento_adverso) ~ "constipacion",
    
    # Infección de piel
    grepl("infeccion de.*piel", nombre_del_evento_adverso) ~ "infeccion de piel",
    
    # Flebitis/tromboflebitis
    grepl("flebitis|tromboflebitis", nombre_del_evento_adverso) ~ "tromboflebitis",
    
    # Derrame pleural
    grepl("derrame pleural", nombre_del_evento_adverso) ~ "derrame pleural",
    
    # Derrame pericárdico
    grepl("derrame pericardico", nombre_del_evento_adverso) ~ "derrame pericardico",
    
    # Fiebre
    grepl("fiebre", nombre_del_evento_adverso) ~ "fiebre",
    
    # Nuaseas - vomito
    grepl("nauseas", nombre_del_evento_adverso) ~ "nauseas o vomito",
    grepl("vomito", nombre_del_evento_adverso) ~ "nauseas o vomito",
    
    #bacteriemia
    grepl("bacteremia", nombre_del_evento_adverso) ~ "bacteriemia",
    grepl("bacteriemia", nombre_del_evento_adverso) ~ "bacteriemia",
    
    # Otros: mantener original
    TRUE ~ nombre_del_evento_adverso
  ))

# Ver resultados
table(df_AE$evento_agrupado) %>% 
  kable
Var1 Freq
accidente cerebrovascular 1
alopecia 1
alteraciones del animo 1
alteraciones vasculares ateromatosis calcificada de segmentos intracraneales de las arterias carotidas internas 1
anemia 5
anorexia 2
apendicitis 2
artralgias 1
artritis 1
ascitis 1
bacteriemia 2
bajo peso 1
bronquiolitis bacteriana 1
caida desde su propia altura 1
cefalea 5
colitis 4
constipacion 4
contusion de muneca izquierda 1
derrame pericardico 2
derrame pleural 1
deshidratacion 1
desordenes del sistema nervioso signos leves de atrofia cerebral cortical y central 1
diarrea 7
disminucion de conteo de linfocitos 1
disminucion de fraccion de eyeccion 5
disminucion del recuento de linfocitos 1
disminucion del recuento de neutrofilos 1
disnea 2
dolor abdominal 8
dolor en el pecho 1
dolor toracico de origen no cardiaco 1
edema 1
edema de miembros inferiores 1
edema pulmonar 1
elevacion de bilirrubinas 1
elevacion de creatinina 2
elevacion de fosfatasa alcalina 3
elevacion de lactato deshidrogenasa 4
elevacion de transaminasas 9
emesis 2
enfermedad diarreica aguda de probable origen infeccioso 1
epistaxis 3
escleritis anterior difusa ojo derecho 1
falla cardiaca 2
fatiga 1
fiebre 3
fistula gastrointestinal 1
fistula gastrointestinal enterocutanea vs progresion tumoral a pared abdominal 1
hematoma 1
hematoma intracraneana hematoma subdural 1
hemorragia conjuntival en ojos bilateral predominio derecho 1
hemorragia digestiva 3
hemorragia uterina 1
hipercalcemia 1
hipercolesterolemia 1
hiperfosfatemia 1
hiperglucemia 1
hiperkalemia 1
hipertension arterial 1
hipertrigliceridemia 4
hipo singulto 1
hipoalbuminemia 2
hipocalcemia 3
hipokalemia 11
hipomagnesemia 3
hiponatremia 2
hipotension 3
hipoxemia 2
infeccion asociada a cateter 1
infeccion de piel 2
infeccion de vias urinarias baja 1
infeccion respiratoria 6
intervalo qt prolongado 1
linfopenia 1
mucositis 7
nauseas o vomito 14
neuropatia periferica sensitiva en miembros inferiores 1
neuropatia sensitiva 1
neutropenia febril 18
ojo seco bilateral 1
orquiepididimitis 1
otalgia derecha 1
otras infecciones e infestaciones infeccion fungica invasiva de brecha 1
otras infecciones e infestaciones lavado bronco alveolar con evidencia de enterobacter cloacae complex y klebsiella oxytoca con patron de resistencia kpc sarm 1
otros desordenes cardiacos imagen con ecogenicidad de tejidos blandos de 5x2 mm altamente movil adherida a extremo distal de cateter central compatible con trombo vs vegetacion 1
palpitaciones 1
pancitopenia severa exacerbacion anemia y trombocitopenia 1
papiloma de la piel verrugas plantares 1
parestesias 1
perdida de peso 5
progresion de la enfermedad 1
prolongacion del intervalo qt corregido 1
prurito 2
purpura humeda 1
queratitis epitelial 1
reaccion alergica 1
reaccion alergica asociaron con transfusion de plaquetas 1
reaccion de hipersensibilidad 1
recaida de leucemia aguda bifenotipica neoplasia benigna maligna o no especificada 1
recuento de neutrofilos disminuido neutropenia 1
retinopatia leucemica 1
rinosinusitis fungica alergica 1
sangrado oral 1
sepsis choque septico refractario 1
sindrome febril 1
sindrome mano pie 1
sobrecarga de hierro 1
sospecha de dolor toracico cardiaco y coronario 1
tos 1
trastorno hidroelectrolitico 2
trombocitopenia 2
trombocitopenia severa secundaria a leucemia mieloide aguda 1
tromboflebitis 2
trombosis venosa profunda aguda 1
urticaria 1

Se verifica cuántos pacientes presentaron el evento adverso

Ver código
n_pacientes_ea <- df_AE %>% 
  distinct(Record_ID1) %>% 
  nrow()
  • 24 presentaron al menos un evento adverso

Se presenta la distribución del evento adverso acorde a la visita realizada.

Ver código
n_ea <- df_AE %>% 
  nrow()
  • 245 fue el total de eventos adversos encontrados
Ver código
df_AE$visita_numero <- factor(df_AE$visita_numero, levels = c("Visita de tamizaje", "Visita de inicio/Ciclo 1", "Ciclo2 Ciclo 2", "Visita de Finalización"), labels = c("Tamizaje", "Ciclo 1", "Ciclo 2", "Finalización"))
table(df_AE$seriedad_evento_adverso, df_AE$visita_numero) %>% 
  addmargins() %>%
  kable
Tamizaje Ciclo 1 Ciclo 2 Finalización Sum
Amenaza a la vida 0 3 0 1 4
Causa la muerte 0 2 2 0 4
No serio 2 42 114 69 227
Produjo o prolongo hospitalización 0 7 2 0 9
Sum 2 54 118 70 244

Se presenta conteo por paciente

Ver código
conteo_eventos <- df_AE %>%
  count(Record_ID1, name = "n_eventos")

conteo_eventos %>% 
  kable()
Record_ID1 n_eventos
1 1
3 3
4 6
6 1
7 6
8 11
9 9
10 11
11 8
12 35
13 4
16 6
17 6
18 9
19 11
20 18
21 5
23 8
25 9
26 8
27 10
28 18
29 12
30 30

Ahora se revisó por paciente de manera concomitante cuántos eventos adversos fueron presentados

Ver código
conteo_eventos <- conteo_eventos %>%
  mutate(
    categoria_eventos = case_when(
      n_eventos == 1 ~ "1 evento",
      n_eventos >= 2 & n_eventos <= 5 ~ "2 - 5 eventos",
      n_eventos >= 6 & n_eventos <= 9 ~ "6 - 9 eventos",
      n_eventos >= 10 ~ "10 o más eventos"
    ),
    categoria_eventos = factor(
      categoria_eventos,
      levels = c("1 evento", "2 - 5 eventos", "6 - 9 eventos", "10 o más eventos")
    )
  )

table(conteo_eventos$categoria_eventos) %>% 
  kable()
Var1 Freq
1 evento 2
2 - 5 eventos 3
6 - 9 eventos 10
10 o más eventos 9

Revisando por tipo de cáncer

Ver código
conteo_eventos1 <-  conteo_eventos%>%
  left_join(df_AE, by = "Record_ID1") %>% 
  distinct()

pacientes_visita <- df_AE %>% 
  select(Record_ID1, visita_numero, seriedad_evento_adverso) %>%  
  distinct()


conteo_eventos1 <- conteo_eventos %>% 
  left_join(pacientes_visita, by = "Record_ID1")


conteo_eventos2 <-  conteo_eventos1%>%
  left_join(df_long, by = "Record_ID1") %>% 
  distinct()


diagnostico <- df_long %>% 
  select(Record_ID1,TIPO_DX ) %>%  
  distinct()

conteo_eventos2 <- conteo_eventos1 %>% 
  left_join(diagnostico, by = "Record_ID1")
  

df_AE_gastrico <- conteo_eventos2 %>% filter(TIPO_DX == "Cancer_Gastrico")
df_AE_Leucemias <- conteo_eventos2 %>% filter(TIPO_DX == "Leucemias")


table(df_AE_gastrico$seriedad_evento_adverso, df_AE_gastrico$visita_numero) %>% 
  addmargins() %>% 
  kable
Tamizaje Ciclo 1 Ciclo 2 Finalización Sum
Causa la muerte 0 2 0 0 2
No serio 0 2 6 5 13
Produjo o prolongo hospitalización 0 3 0 0 3
Sum 0 7 6 5 18
Ver código
table(df_AE_gastrico$categoria_eventos) %>% 
  kable
Var1 Freq
1 evento 2
2 - 5 eventos 5
6 - 9 eventos 11
10 o más eventos 0
Ver código
table(df_AE_Leucemias$seriedad_evento_adverso, df_AE_Leucemias$visita_numero) %>% 
  addmargins() %>% 
  kable
Tamizaje Ciclo 1 Ciclo 2 Finalización Sum
Amenaza a la vida 0 3 0 1 4
Causa la muerte 0 0 2 0 2
No serio 1 7 12 11 31
Produjo o prolongo hospitalización 0 4 1 0 5
Sum 1 14 15 12 42
Ver código
table(df_AE_Leucemias$categoria_eventos) %>% 
  kable
Var1 Freq
1 evento 0
2 - 5 eventos 2
6 - 9 eventos 12
10 o más eventos 29

Objetivos exploratorios - suervivencia

Ver código
#df1 <- gt_examen3 %>% gt::as_raw_html() %>% rvest::read_html() %>% rvest::html_table() %>% .[[1]]
#df2 <- gt_examen4 %>% gt::as_raw_html() %>% rvest::read_html() %>% rvest::html_table() %>% .[[1]]

#library(openxlsx)

#wb <- createWorkbook()
#addWorksheet(wb, "Cancer_Gastrico")
#writeData(wb, "Cancer_Gastrico", df1)

#addWorksheet(wb, "Leucemias")
#writeData(wb, "Leucemias", df2)

#saveWorkbook(wb, "tablas_juntas.xlsx", overwrite = TRUE)