TABLA 1

library(readxl)
BASE <- read_excel("Base de datos Hernia oculta pirosis vs nerd (1).xlsx")
library(dplyr)
#names(BASE)
BASE <- BASE |> select(Sexo:`Diagnóstico manometría`)

library(stringr)
BASE$`Diagnostico pH (es el diagnóstico de comparación)` <- str_to_title(BASE$`Diagnostico pH (es el diagnóstico de comparación)`)
BASE$`RESERVA CONTRACTIL` <- str_to_title(BASE$`RESERVA CONTRACTIL`)
BASE$`RESERVA CONTRACTIL` <- case_when(
  BASE$`RESERVA CONTRACTIL`%in% c("adecuado", "adecuada", "Adecuado", "Adecuada") ~ "Adecuado",
  BASE$`RESERVA CONTRACTIL` %in% c("inadecuado", "inadecuada", "Inadecuado", "Inadecuada", "Inadecauda") ~ "Inadecuado",
  TRUE ~ BASE$`RESERVA CONTRACTIL`
)

library(gtsummary)

#cat(names(BASE), sep = ",")
tabla1 <- BASE %>%
  select(Sexo,Edad,`IMC kg/m2`,Diabetes,HTA,`Tiempo de exposición ácida % (PH)`,`N de eventos de reflujo`, `Diagnostico pH (es el diagnóstico de comparación)`,`Impedancia del segmento contractil distal Ohms`,`Integral contractil mmHg/cm`,`DCI mmHg/cm/seg`,`ACLARAMIENTO ESOFAGICO`,`PRESION EII`, `RESERVA CONTRACTIL`, `HERNIA OCULTA`,`Diagnóstico manometría`) %>%
  tbl_summary(
    by = `Diagnostico pH (es el diagnóstico de comparación)`,
    type = list(
      all_continuous()                    ~ "continuous2",
      c(Sexo, Diabetes, HTA, `RESERVA CONTRACTIL`, `HERNIA OCULTA`,`Diagnóstico manometría`)            ~ "categorical"
    ),
    label = list(
      Sexo ~ "Sexo",
      Edad ~ "Edad",
      `IMC kg/m2` ~ "IMC kg/m2",
      Diabetes ~ "Diabetes",
      HTA ~ "HTA",
      `Tiempo de exposición ácida % (PH)` ~ "Tiempo exposición ácida% (PH)",
      `N de eventos de reflujo` ~ "Eventos de reflujo", 
      `Impedancia del segmento contractil distal Ohms` ~"Impedancia segmento contractil distal (OHMS)",
      `Integral contractil mmHg/cm` ~ "Integral contractil (mmHg/cm)",
      `DCI mmHg/cm/seg` ~ "DCI mmHg/CM/SEG",
      `ACLARAMIENTO ESOFAGICO` ~ "Aclaramiento esofágico",
      `PRESION EII` ~ "Presión EEI", 
      `RESERVA CONTRACTIL` ~ "Reserva Contractil", 
      `HERNIA OCULTA` ~ "Hernia Oculta",
      `Diagnóstico manometría` ~ "Diagnóstico manometría"
    ),
    statistic = list(
      all_continuous2()  ~ c(
        "{mean} ({sd})",
        "{median} ({p25}, {p75})",
        "{min} - {max}"
      ),
      all_categorical() ~ "{n} ({p}%)"
    ),
    digits = list(
      all_continuous()  ~ 2,
      all_categorical() ~ 1
    ),
    missing = "ifany",
    missing_text = "Sin dato"
  ) %>%
  add_p(
    test = list(
      all_continuous2()  ~ "kruskal.test",  
      all_categorical() ~ "chisq.test"
    ),
    pvalue_fun = ~ style_pvalue(.x, digits = 3)
  ) %>%
  add_overall() %>%
  modify_header(label ~ "**Variable**") %>%
  bold_labels() %>%
  bold_p(t = 0.05) %>%
  modify_caption("**Tabla 1**")

tabla1
Tabla 1
Variable Overall
N = 94
1
Nerd
N = 43
1
Pirosis Funcional
N = 51
1
p-value
Sexo



    Femenino 59.0 (64.1%) 27.0 (62.8%) 32.0 (65.3%)
    Masculino 33.0 (35.9%) 16.0 (37.2%) 17.0 (34.7%)
    Sin dato 2 0 2
Edad



    Mean (SD) 56.08 (14.40) 55.67 (15.02) 56.42 (13.99)
    Median (Q1, Q3) 57.00 (45.00, 68.00) 57.00 (43.00, 69.00) 55.50 (45.00, 67.00)
    Min - Max 26.00 - 82.00 26.00 - 81.00 32.00 - 82.00
    Sin dato 1 0 1
IMC kg/m2



    Mean (SD) 24.41 (3.41) 23.57 (3.38) 25.11 (3.32)
    Median (Q1, Q3) 24.48 (21.50, 25.88) 23.40 (20.40, 25.30) 24.86 (22.76, 27.24)
    Min - Max 18.38 - 32.79 19.30 - 30.80 18.38 - 32.79
Diabetes



    0 67.0 (71.3%) 20.0 (46.5%) 47.0 (92.2%)
    1 27.0 (28.7%) 23.0 (53.5%) 4.0 (7.8%)
HTA



    0 73.0 (77.7%) 29.0 (67.4%) 44.0 (86.3%)
    1 21.0 (22.3%) 14.0 (32.6%) 7.0 (13.7%)
Tiempo exposición ácida% (PH)



    Mean (SD) 495.16 (4,756.76) 1,080.80 (7,032.42) 1.38 (1.19)
    Median (Q1, Q3) 3.20 (1.20, 7.30) 7.50 (6.50, 9.10) 1.20 (0.40, 2.10)
    Min - Max 0.00 - 46,123.00 6.00 - 46,123.00 0.00 - 5.40
Eventos de reflujo



    Mean (SD) 48.60 (33.96) 64.02 (39.74) 35.59 (21.00)
    Median (Q1, Q3) 39.00 (23.00, 65.00) 58.00 (37.00, 87.00) 31.00 (20.00, 51.00)
    Min - Max 1.00 - 185.00 15.00 - 185.00 1.00 - 82.00
Impedancia segmento contractil distal (OHMS)



    Mean (SD) 2,198.41 (588.20) 1,622.21 (295.16) 2,684.24 (209.91)
    Median (Q1, Q3) 2,398.50 (1,534.00, 2,734.00) 1,532.00 (1,467.00, 1,615.00) 2,678.00 (2,546.00, 2,789.00)
    Min - Max 1,230.00 - 3,200.00 1,230.00 - 2,578.00 2,156.00 - 3,200.00
Integral contractil (mmHg/cm)



    Mean (SD) 34.64 (7.83) 32.61 (9.27) 36.35 (5.95)
    Median (Q1, Q3) 33.45 (29.70, 37.90) 30.20 (27.30, 35.60) 35.20 (32.40, 41.10)
    Min - Max 20.50 - 67.80 20.50 - 67.80 24.80 - 48.70
DCI mmHg/CM/SEG



    Mean (SD) 1,666.80 (1,435.33) 1,129.58 (869.53) 2,119.75 (1,655.10)
    Median (Q1, Q3) 1,338.50 (668.00, 1,998.00) 983.00 (516.00, 1,651.00) 1,654.00 (948.00, 2,864.00)
    Min - Max 0.00 - 7,004.00 0.00 - 3,555.00 150.00 - 7,004.00
Aclaramiento esofágico



    Mean (SD) 67.23 (35.12) 60.70 (38.13) 72.75 (31.69)
    Median (Q1, Q3) 80.00 (40.00, 100.00) 70.00 (30.00, 100.00) 80.00 (60.00, 100.00)
    Min - Max 0.00 - 100.00 0.00 - 100.00 0.00 - 100.00
Presión EEI



    Mean (SD) 22.33 (11.36) 20.57 (11.16) 23.81 (11.42)
    Median (Q1, Q3) 20.35 (14.70, 29.90) 18.90 (11.40, 29.90) 20.70 (17.10, 31.00)
    Min - Max 1.30 - 61.70 2.10 - 42.80 1.30 - 61.70
Reserva Contractil



    Adecuado 53.0 (56.4%) 25.0 (58.1%) 28.0 (54.9%)
    Inadecuado 41.0 (43.6%) 18.0 (41.9%) 23.0 (45.1%)
Hernia Oculta



    no 74.0 (78.7%) 38.0 (88.4%) 36.0 (70.6%)
    si 20.0 (21.3%) 5.0 (11.6%) 15.0 (29.4%)
Diagnóstico manometría



    Contractilidad ausente 3.0 (3.2%) 3.0 (7.0%) 0.0 (0.0%)
    Hipercontractil 2.0 (2.1%) 0.0 (0.0%) 2.0 (3.9%)
    MEI 12.0 (12.8%) 6.0 (14.0%) 6.0 (11.8%)
    No conclusivo para MEI 1.0 (1.1%) 1.0 (2.3%) 0.0 (0.0%)
    No conclusivo para OTS 3.0 (3.2%) 2.0 (4.7%) 1.0 (2.0%)
    Normal 72.0 (76.6%) 31.0 (72.1%) 41.0 (80.4%)
    OTS 1.0 (1.1%) 0.0 (0.0%) 1.0 (2.0%)
1 n (%)
library(flextable)
tabla1 %>%
  as_flex_table() %>%
  save_as_docx(path = "tabla1.1.docx")
library(tableone)
library(openxlsx)
library(tibble)
library(reactable)

myVars <- c("Sexo", "Edad", "IMC kg/m2", "Diabetes", "HTA",
            "Tiempo de exposición ácida % (PH)",
            "N de eventos de reflujo",
            "Impedancia del segmento contractil distal Ohms",
            "Integral contractil mmHg/cm",
            "DCI mmHg/cm/seg",
            "ACLARAMIENTO ESOFAGICO",
            "PRESION EII",
            "RESERVA CONTRACTIL",
            "HERNIA OCULTA",
            "Diagnóstico manometría")

catVars <- c("Sexo", "Diabetes", "HTA",
             "RESERVA CONTRACTIL",
             "HERNIA OCULTA",
             "Diagnóstico manometría")

tab <- CreateTableOne(
  vars    = myVars,
  strata  = "Diagnostico pH (es el diagnóstico de comparación)",
  factorVars = catVars,
  data    = BASE,
  includeNA  = FALSE,
  addOverall = TRUE,
  testNonNormal = TRUE
)

tableone <- as.data.frame(print(tab, 
                               showAllLevels = TRUE, 
                               printToggle   = FALSE, 
                               noSpaces      = TRUE))

# Renombrar filas para que se vean bonito
nombres_bonitos <- c(
  "Sexo",
  "Edad (años)",
  "IMC (kg/m²)",
  "Diabetes",
  "HTA",
  "Tiempo exposición ácida % (pH)",
  "N° eventos de reflujo",
  "Impedancia segmento contractil distal (Ω)",
  "Integral contractil (mmHg/cm)",
  "DCI (mmHg/cm/seg)",
  "Aclaramiento esofágico",
  "Presión EEI",
  "Reserva contractil",
  "Hernia oculta",
  "Diagnóstico manometría"
)

# Solo renombra las filas que corresponden a variables principales
# (tableone agrega filas extra por niveles de factores)
limpiar_nombres <- function(nombres) {
  nombres %>%
    gsub("\\(X.*?\\)", "", .) %>%
    gsub("X", "", .)           %>%
    gsub("\\.{1,}", " ", .)    %>%
    gsub("\\s+", " ", .)       %>%
    trimws(.)
}

rownames(tableone) <- limpiar_nombres(rownames(tableone))

# Exportar a Excel
write.xlsx(tableone, "tabla1.xlsx", rowNames = TRUE, colNames = TRUE)

# Tabla reactable
tabla_reactable <- tableone %>%
  rownames_to_column("Variable") %>%
  reactable(
    pagination       = FALSE,
    defaultPageSize  = nrow(tableone),
    columns = list(
      Variable = colDef(
        style     = list(backgroundColor = "#2C3E50", color = "white", fontWeight = "bold"),
        width     = 250,
        align     = "left"
      )
    ),
    theme = reactableTheme(
      headerStyle = list(
        backgroundColor = "#34495E",
        color           = "white",
        fontWeight      = "bold",
        fontSize        = "13px"
      ),
      cellStyle   = list(fontSize = "11px"),
      stripedColor = "#F8F9FA"
    ),
    striped    = TRUE,
    highlight  = TRUE,
    bordered   = TRUE,
    compact    = TRUE,
    wrap       = FALSE,
    resizable  = TRUE
  )

tabla_reactable
library(flextable)

tableone %>%
  rownames_to_column("Variable") %>%
  flextable() %>%
  bold(part = "header") %>%
  bold(j = 1) %>%
  bg(part = "header", bg = "#2C3E50") %>%
  color(part = "header", color = "white") %>%
  bg(i = seq(2, nrow(tableone), 2), bg = "#F8F9FA") %>%  # filas alternas
  autofit() %>%
  set_caption("Tabla 1. Características de la muestra según diagnóstico pH") %>%
  save_as_docx(path = "tabla1.docx")