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
| Variable | Overall N = 941 |
Nerd N = 431 |
Pirosis Funcional N = 511 |
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")