Ingesta

Autores/as

Mario Camacho

Raúl Castañeda

Fecha de publicación

20 octubre 2025

Stakeholder: Jose L Merino Rivas Centro: Hospital del Henares
Fecha última modificación: 23 marzo 2026

Input

Input
data <- read_excel("raw_data/data_estructurado.xlsx", sheet = "data")
data <- data |> mutate(Aleatorización = factor(if_else(Aleatorización=='0','Ferinject', Aleatorización), levels = c("Venofer", "Ferinject")))
data <- data |> mutate(across(where(~ inherits(., "POSIXt")), as.Date))
data <- data |> mutate(across(contains("Causa exitus"), as.character)) # A los doce meses es booleana
data <- data |> mutate(across(where(is.character), as.factor))
data <- data |> mutate(across(where(~ all(. %in% c(0,1,NA))), as.factor))
data <- data |> mutate(across(c('Aleatorización'), as.factor))
data <- data |> mutate(across(contains("(código)"), as.factor))
data <- data |> mutate(across(contains("Dosis extra"), as.numeric))
data <- data |> mutate(across(contains("Dosis (dosis)"), as.numeric))

# Hay datos basales que cambian en cada control no identificados
data <-
data |> rename('Control Basal Portador CT' = 'Portador CT',
               'Control Basal Portador FAV' = 'Portador FAV',
               'Control Basal Portador PTFE' = 'Portador PTFE',
               'Control Basal Portador ambos' = 'Portador ambos')

data <- data |> mutate('Edad' = floor(interval(`Fecha nacimiento`, `Fecha inicio HD`) / years(1)))
# Valido que tengo el mismo número de variables en cada control
data.frame(
  Control = unique(str_extract(colnames(data), "Control \\d+ meses")),
  stringsAsFactors = FALSE
) %>%
  rowwise() %>%
  mutate(Num_Columnas = sum(str_detect(colnames(data), fixed(Control))))
# A tibble: 7 × 2
# Rowwise: 
  Control          Num_Columnas
  <chr>                   <int>
1 <NA>                       NA
2 Control 2 meses            28
3 Control 4 meses            28
4 Control 6 meses            28
5 Control 8 meses            28
6 Control 10 meses           28
7 Control 12 meses           26

Columnas sin variabilidad

cols_all_na <- colnames(data)[sapply(data, function(x) all(is.na(x)))]
cols_single_value <- colnames(data)[sapply(data, function(x) length(unique(x)) == 1)]
cols_single_value <- setdiff(cols_single_value, cols_all_na)

list(
  all_NA = cols_all_na,
  single_value = cols_single_value
)
$all_NA
[1] "Control 4 meses Dosis extra"         
[2] "Control 4 meses Dosis extra (dosis)" 
[3] "Control 10 meses Dosis extra"        
[4] "Control 10 meses Dosis extra (dosis)"
[5] "Control 12 meses Causa exitus"       

$single_value
[1] "Fecha inicio Estudio"         "Control Basal Portador ambos"
head(data[cols_single_value])
# A tibble: 6 × 2
  `Fecha inicio Estudio` `Control Basal Portador ambos`
  <date>                 <fct>                         
1 2023-06-01             0                             
2 2023-06-01             0                             
3 2023-06-01             0                             
4 2023-06-01             0                             
5 2023-06-01             0                             
6 2023-06-01             0                             

Dudas y calidad del dato

  • ¿“Portador ambos” se refiere a “portador de los tres”?
data |> select(c(`Control Basal Portador CT`,`Control Basal Portador FAV`,`Control Basal Portador PTFE`,`Control Basal Portador ambos`)) |> group_by_all() |> count()
# A tibble: 3 × 5
# Groups:   Control Basal Portador CT, Control Basal Portador FAV, Control
#   Basal Portador PTFE, Control Basal Portador ambos [3]
  `Control Basal Portador CT` Control Basal Portador FA…¹ Control Basal Portad…²
  <fct>                       <fct>                       <fct>                 
1 0                           0                           1                     
2 0                           1                           0                     
3 1                           0                           0                     
# ℹ abbreviated names: ¹​`Control Basal Portador FAV`,
#   ²​`Control Basal Portador PTFE`
# ℹ 2 more variables: `Control Basal Portador ambos` <fct>, n <int>
  • ¿La suma de los tres FAV debería ser igual al total de Portador FAV?
data |> select(c(`Control Basal Portador FAV`,`FAV RC`,`FAV HC`,`FAV HB`)) |> group_by_all() |> count()
## # A tibble: 4 × 5
## # Groups:   Control Basal Portador FAV, FAV RC, FAV HC, FAV HB [4]
##   `Control Basal Portador FAV` `FAV RC` `FAV HC` `FAV HB`     n
##   <fct>                        <fct>    <fct>    <fct>    <int>
## 1 0                            0        0        0           35
## 2 1                            0        0        1            1
## 3 1                            0        1        0           17
## 4 1                            1        0        0           11

data |> select(c(`Control Basal Portador FAV`, `FAV RC`, `FAV HC`, `FAV HB`)) |> mutate(across(everything(), as.numeric)-1) |> colSums()
## Control Basal Portador FAV                     FAV RC 
##                         29                         11 
##                     FAV HC                     FAV HB 
##                         17                          1
# 11+18+1 = 30

data |> select(c(`Control Basal Portador FAV`, `FAV RC`, `FAV HC`, `FAV HB`)) |> mutate(across(everything(), as.numeric)-1, total_FAV = rowSums(across(c(`FAV RC`, `FAV HC`, `FAV HB`)))) |> arrange(-total_FAV) |> head()
## # A tibble: 6 × 5
##   `Control Basal Portador FAV` `FAV RC` `FAV HC` `FAV HB` total_FAV
##                          <dbl>    <dbl>    <dbl>    <dbl>     <dbl>
## 1                            1        0        1        0         1
## 2                            1        1        0        0         1
## 3                            1        1        0        0         1
## 4                            1        0        1        0         1
## 5                            1        1        0        0         1
## 6                            1        1        0        0         1
[1] "La calidad del dato se da por buena después de haber corregido datos de pacientes junto con el doctor Jose Luis Merino."

Validación Causa exitus

data |> select(contains("Causa exitus")) |> head(2) |> as.data.frame()
  Control 2 meses Causa exitus Control 4 meses Causa exitus
1                         <NA>                         <NA>
2                         <NA>                         <NA>
  Control 6 meses Causa exitus Control 8 meses Causa exitus
1                         <NA>                         <NA>
2                         <NA>                         <NA>
  Control 10 meses Causa exitus Control 12 meses Causa exitus
1                          <NA>                          <NA>
2                          <NA>                          <NA>

Validación de filas con más de una causa de exitus reportada.

cols_exitus <- data |> select(contains("Causa exitus"))

control_exitus <- cols_exitus |> 
  mutate(id = row_number()) |>
  pivot_longer(
    cols = -id,
    names_to = "Variable",
    values_to = "Causa",
    values_drop_na = TRUE
  ) |> 
  mutate(
    Mes = str_extract(Variable, "\\d+"),  # Extraer mes
    Mes = as.integer(Mes)
  )

control_exitus |> 
  group_by(id) |> 
  summarise(Cantidad = n(), .groups = "drop") |> 
  filter(Cantidad > 1)
# A tibble: 0 × 2
# ℹ 2 variables: id <int>, Cantidad <int>

Una vez validado que cada id tiene máximo un éxitus en las sesiones de control, paso las dummies de exitus a booleana y relleno hacia delante los éxitus anotados.

data |> filter(!is.na(`Control 4 meses Causa exitus`)) |> select(c('id',`Control 4 meses Causa exitus`)) |> as.data.frame()
  id       Control 4 meses Causa exitus
1  9 Inf. respiratoria + pluripatología
2 39                       ERC terminal
data |> filter(id==9) |> select(contains("Causa exitus"))
# A tibble: 1 × 6
  `Control 2 meses Causa exitus` Control 4 meses Causa …¹ Control 6 meses Caus…²
  <fct>                          <fct>                    <fct>                 
1 <NA>                           Inf. respiratoria + plu… <NA>                  
# ℹ abbreviated names: ¹​`Control 4 meses Causa exitus`,
#   ²​`Control 6 meses Causa exitus`
# ℹ 3 more variables: `Control 8 meses Causa exitus` <fct>,
#   `Control 10 meses Causa exitus` <fct>,
#   `Control 12 meses Causa exitus` <fct>
data <- data |> 
  rowwise() |> 
  mutate(across(all_of(colnames(cols_exitus)), 
                ~ {
                  vals <- c_across(all_of(colnames(cols_exitus)))
                  for(i in 2:length(vals)) if(is.na(vals[i])) vals[i] <- vals[i-1]
                  vals[cur_column() == colnames(cols_exitus)]
                }, 
                .names = "{.col} acum")) |> # Para no sobrecribir columnas
  ungroup()
data |> filter(id==9) |> select(contains("Causa exitus") & contains("acum"))
# A tibble: 1 × 6
  Control 2 meses Causa exitus a…¹ Control 4 meses Caus…² Control 6 meses Caus…³
  <fct>                            <fct>                  <fct>                 
1 <NA>                             Inf. respiratoria + p… Inf. respiratoria + p…
# ℹ abbreviated names: ¹​`Control 2 meses Causa exitus acum`,
#   ²​`Control 4 meses Causa exitus acum`, ³​`Control 6 meses Causa exitus acum`
# ℹ 3 more variables: `Control 8 meses Causa exitus acum` <fct>,
#   `Control 10 meses Causa exitus acum` <fct>,
#   `Control 12 meses Causa exitus acum` <fct>
data <- data |> 
  left_join(
    control_exitus |> 
      group_by(id) |> 
      summarise(`Es exitus` = as.integer(any(!is.na(Causa))), .groups = "drop"),
    by = c("id" = "id")
  )

data <- data |> 
  left_join(
    control_exitus |> select(c('id','Variable')) |> rename(`Momento exitus`=Variable) |> mutate(`Momento exitus` = as.factor(`Momento exitus`)),
    by = c("id" = "id")
  )
table(data$`Momento exitus`)

Control 10 meses Causa exitus  Control 2 meses Causa exitus 
                            1                             1 
 Control 4 meses Causa exitus  Control 6 meses Causa exitus 
                            2                             1 
 Control 8 meses Causa exitus 
                            1 
data |> 
  select(contains("exitus") & !contains("acum") & !contains("Momento exitus")) |> 
  mutate(across(everything(), ~ as.factor(ifelse(is.na(.) | . == "NA", '0', '1')))) |> summary()
 Control 2 meses Causa exitus Control 4 meses Causa exitus
 0:63                         0:62                        
 1: 1                         1: 2                        
 Control 6 meses Causa exitus Control 8 meses Causa exitus
 0:63                         0:63                        
 1: 1                         1: 1                        
 Control 10 meses Causa exitus Control 12 meses Causa exitus Es exitus
 0:63                          0:64                          0:58     
 1: 1                                                        1: 6     
data |> 
  select(contains("exitus") & contains("acum")) |> 
  mutate(across(everything(), ~ as.factor(ifelse(is.na(.) | . == "NA", '0', '1')))) |> summary()
 Control 2 meses Causa exitus acum Control 4 meses Causa exitus acum
 0:63                              0:61                             
 1: 1                              1: 3                             
 Control 6 meses Causa exitus acum Control 8 meses Causa exitus acum
 0:60                              0:59                             
 1: 4                              1: 5                             
 Control 10 meses Causa exitus acum Control 12 meses Causa exitus acum
 0:58                               0:58                              
 1: 6                               1: 6                              

Ejemplo

Persona a que llega viva al control de los diez meses.

a <- data |> filter(!(`Momento exitus` %in% c("Control 2 meses Causa exitus","Control 4 meses Causa exitus","Control 6 meses Causa exitus","Control 8 meses Causa exitus","Control 10 meses Causa exitus")))

a |> filter(id==3) |> t() |> as_tibble(rownames = "variable") |> rename(value = V1) |> filter(grepl("^id$|Basal Hb|Basal Ferritina|meses Hb|meses Ferritina", variable))
# A tibble: 15 × 2
   variable                   value
   <chr>                      <chr>
 1 id                         3    
 2 Control Basal Hb           12.5 
 3 Control Basal Ferritina    <NA> 
 4 Control 2 meses Hb         10.2 
 5 Control 2 meses Ferritina  466  
 6 Control 4 meses Hb         11.8 
 7 Control 4 meses Ferritina  448  
 8 Control 6 meses Hb         12.1 
 9 Control 6 meses Ferritina  517  
10 Control 8 meses Hb         11.7 
11 Control 8 meses Ferritina  535  
12 Control 10 meses Hb        11.9 
13 Control 10 meses Ferritina 452  
14 Control 12 meses Hb        10   
15 Control 12 meses Ferritina 405  
a |> select(c('id',matches("Basal"))) |> # select(-c("Control Basal Diuresis")) |> 
  filter(if_any(everything(), ~ is.na(.x))) |> select(c('id',where(~ any(is.na(.x)))))
# A tibble: 58 × 7
      id `Control Basal Ferritina` `Control Basal IST` Control Basal Dosis FEE…¹
   <dbl>                     <dbl>               <dbl>                     <dbl>
 1     1                       414               26.4                       2000
 2     2                       265               17.8                       1200
 3     3                        NA               NA                           NA
 4     4                       517               27.3                         NA
 5     5                       308                8.58                      9000
 6     6                       238               31.1                         NA
 7     7                       131               13.2                       4000
 8     8                       118                9.88                        NA
 9    10                       132               13.2                       9000
10    11                       330               13.5                       6000
# ℹ 48 more rows
# ℹ abbreviated name: ¹​`Control Basal Dosis FEE semanal Beta eritropoyetina`
# ℹ 3 more variables: `Control Basal Dosis FEE semanal Darbepoetina` <dbl>,
#   `Control basal Dosis extra` <dbl>,
#   `Control basal Dosis extra (dosis)` <dbl>

Save

# saveRDS(list(data = data, data_long = data_long), "data/data.RDA")
saveRDS(list(data = data), "data/data.RDA")