From cd1e4f95ac4cbece48749a135d8fdfde62502f2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=ADn=20Lotto=20Batista?= Date: Sat, 30 Mar 2024 17:12:35 +0100 Subject: [PATCH] update slides intro02_es --- intro/intro02_es/intro02_es.Rmd | 563 ++++++------ intro/intro02_es/intro02_es.html | 868 +++++++++--------- .../libs/datatables-binding/datatables.js | 79 +- .../dt-core/css/jquery.dataTables.min.css | 2 +- .../libs/dt-core/js/jquery.dataTables.min.js | 4 +- 5 files changed, 776 insertions(+), 740 deletions(-) diff --git a/intro/intro02_es/intro02_es.Rmd b/intro/intro02_es/intro02_es.Rmd index ae5f4fc..5d945d6 100644 --- a/intro/intro02_es/intro02_es.Rmd +++ b/intro/intro02_es/intro02_es.Rmd @@ -32,7 +32,7 @@ icons::download_fontawesome() ```{r setup, include=FALSE} knitr::opts_chunk$set(echo = FALSE, warning = FALSE, - message = FALSE, + messedad = FALSE, fig.retina = 3 ## retina more effective than w/h (according to twitter) # fig.width = 16, # fig.height = 10 @@ -51,7 +51,7 @@ pacman::p_load( here, # relative file pathways janitor, # data cleaning and tables lubridate, # working with dates - tidyverse, # data management and visualization + tidyverse, # data manedadment and visualization gtsummary, # summary tables flair, # for decorating code chunks with colors kableExtra, # for output tables @@ -73,7 +73,7 @@ pacman::p_load( style_mono_accent( base_color = "#00538c", link_color = "#48a878", - ## add logo to the title page (bit bigger) + ## add logo to the title pedad (bit bigger) title_slide_background_image = "https://raw.githubusercontent.com/appliedepi/slides/master/images/logo.png", title_slide_background_position = "95% 95%", title_slide_background_size = "25%", @@ -146,7 +146,7 @@ surv_raw <- rio::import(here::here("data", "surveillance_linelist_20141201.csv") # Introducción a R para
Epidemiología Aplicada -### El caso práctico del ébola y la limpieza de datos +### Caso práctico de ébola y limpieza de datos [contact@appliedepi.org](mailto:contact@appliedepi.org) @@ -154,26 +154,26 @@ surv_raw <- rio::import(here::here("data", "surveillance_linelist_20141201.csv") # Objetivos y calendario -- Crear un nuevo proyecto RStudio para el caso práctico del ébola -- Importa los datos de una subcarpeta del proyecto utilizando `import()` y `here()` -- Familiarizarte con {dplyr} funciones de limpieza de datos -- Empieza a escribir un comando de limpieza utilizando la función `%>%` operador de tubería +- Crear un nuevo proyecto de RStudio para el caso práctico de ébola +- Importar los datos de una subcarpeta del proyecto utilizando `import()` y `here()` +- Familiarizarte con funciones de limpieza de datos {dplyr} +- Empezar a escribir un comando de limpieza utilizando el operador 'pipe' `%>%`
-```{r, echo=FALSE, warning=F, message=F} +```{r, echo=FALSE, warning=F, messedad=F} outline <- dplyr::tribble( ~Time, ~Topic, - "10 minutes", "Set up of the Ebola case study", - "20 minutes", "Functions for data cleaning", - "10 minutes", "Demo of data cleaning", - "2 hours", "Exercise", - "20 minutes", "Debrief" + "10 minutos", "Introducir el caso de estudio de ébola", + "20 minutos", "Funciones para limpieza de datos", + "10 minutos", "Demo de limpieza de datos", + "2 horas", "Ejercicio", + "20 minutos", "Devolución" ) outline %>% flextable::qflextable() %>% - flextable::add_footer_lines("Take breaks as you wish during the exercise") + flextable::add_footer_lines("Toma las pausas que necesites durante el ejercicio") ``` ??? @@ -181,21 +181,21 @@ Fíjate en las pausas de estiramiento. --- -# Revisa +# Agenda - **Proyectos RStudio** - un hogar para los datos y scripts de un análisis concreto -- -- Ejecutar comandos en **un script de R**, con comentarios +- Ejecutar comandos en **un script de R** usando comentarios -- -- Creando **objetos** con el operador de asignación **`<-`** +- Crear **objetos** con el operador de asignación **`<-`** -- -- Utilizando **funciones** como `max()`, `min()` y `paste()` +- Utilizar **funciones** como `max()`, `min()` y `paste()` -- @@ -207,15 +207,15 @@ Fíjate en las pausas de estiramiento. -- -- Las columnas tienen **clases** que pueden comprobarse con `class()` +- Comprobar la **clase** de las columnas `class()` --- class: inverse, center, middle -# El caso práctico del ébola +# El caso de estudio: el brote de ébola -Los módulos 2-8 utilizarán datos de un brote simulado de ébola en Sierra Leona. +Los módulos 2 a 8 utilizarán datos de un brote simulado de ébola en Sierra Leona. --- @@ -223,7 +223,7 @@ Los módulos 2-8 utilizarán datos de un brote simulado de ébola en Sierra Leon .pull-left[ -El ejercicio te guiará para crear un nuevo **proyecto RStudio** en la carpeta "intro\_curso/**ébola**/". +El ejercicio te guiará para crear un nuevo **proyecto de RStudio** en la carpeta "intro\_curso/**ebola**/". ```{r, eval=TRUE, echo=FALSE, out.width="85%"} # Using here() alone won't work because Rmd folder becomes the rendering root. @@ -238,23 +238,23 @@ knitr::include_graphics(xfun::relative_path(here::here("images", "functions_pack `r emo::ji("folder")` intro\_curso -- `r emo::ji("folder")` módulo1 +- `r emo::ji("folder")` modulo1 - `r emo::ji("folder")` covid -- **`r emo::ji("folder")` ébola** +- **`r emo::ji("folder")` ebola** - **ebola.Rproj** - `r emo::ji("folder")` datos - `r emo::ji("folder")` salidas - - `r emo::ji("folder")` guiones + - `r emo::ji("folder")` scripts ] --- -# Un nuevo R Script +# Un nuevo Script de R .pull-left[ -Escribirás un nuevo script de R llamado "ebola\_análisis.R" para guardar tus comandos. +Escribirás un nuevo script de R llamado "ebola\_analisis.R" para guardar tus comandos. El script se guardará en la subcarpeta "ebola/**scripts**/" @@ -271,14 +271,14 @@ knitr::include_graphics(xfun::relative_path(here::here("images", "data_cleaning" `r emo::ji("folder")` intro\_curso -- `r emo::ji("folder")` módulo1 +- `r emo::ji("folder")` modulo1 - `r emo::ji("folder")` covid -- `r emo::ji("folder")` **ébola** +- `r emo::ji("folder")` **ebola** - **ebola.Rproj** - `r emo::ji("folder")` datos - `r emo::ji("folder")` salidas - - `r emo::ji("folder")` **guiones** - - **análisis\_ébola.R** + - `r emo::ji("folder")` **scripts** + - **analisis\_ebola.R** ] @@ -294,34 +294,33 @@ Utiliza **`pacman::p_load()`** para **cargar los paquetes** necesarios para el a ```{r, echo=T, eval=F} pacman::p_load( - rio, # for importing data - here, # for relative file paths - skimr, # for reviewing the data - janitor, # for cleaning data - epikit, # for creating age categories - tidyverse # for data management and visualization + rio, # para importar datos + here, # para rutas relativas para localizar arhivos + skimr, # para revisar los datos + janitor, # para limpieza de datos + epikit, # para crear categorías de edad + tidyverse # para manejo de datos y visualización ) ``` --- -# Importar datos de una subcarpeta +# Importar desde una subcarpeta -La lista de líneas del ébola se guarda en la subcarpeta "**datos**/**en bruto**/": - -`r emo::ji("folder")` **ébola** +El listado de casos de ébola se guarda en la subcarpeta "**datos**/**brutos**/": +`r emo::ji("folder")` **ebola** - ebola.Rproj - `r emo::ji("folder")` **datos** - - `r emo::ji("folder")` limpia - - `r emo::ji("folder")` **en bruto** + - `r emo::ji("folder")` limpios + - `r emo::ji("folder")` **brutos** - **surveillance\_linelist\_20141201.csv** - `r emo::ji("folder")` scripts - `r emo::ji("folder")` salidas -`import()` espera un *ruta de archivo* - la ubicación o "dirección" de los datos en tu ordenador. +`import()` espera un *ruta de archivo*: la ubicación o "dirección" de los datos -¿Funcionará este comando para importar la lista de líneas del Ébola? +¿Funcionará este comando para importar el listado de casos de ébola? ```{r, echo=T, eval=F} import("surveillance_linelist_20141201.csv") @@ -329,13 +328,13 @@ import("surveillance_linelist_20141201.csv") -- -**No** tienes que especificar qué *subcarpeta* del proyecto se guardan los datos. +**No**, tienes que especificar en qué *subcarpeta* del proyecto se guardan los datos. --- # Rutas de los archivos -**Evita** la frágil ruta de archivo "absoluta *(sólo funciona en un ordenador)* +**Evita** la frágil ruta de archivo "absoluta" *(sólo funciona en un ordenador)* ```{r, echo=T, eval=F} import("C:/Users/Me/Docs/intro_course/ebola/data/raw/surveillance_linelist_20141201.csv") @@ -346,7 +345,7 @@ import("C:/Users/Me/Docs/intro_course/ebola/data/raw/surveillance_linelist_20141 **En un proyecto de RStudio** la ruta puede empezar en la carpeta raíz del proyecto ```{r, echo=T, eval=F} -import("data/raw/surveillance_linelist_20141201.csv") # works on almost any computer +import("data/raw/surveillance_linelist_20141201.csv") # funciona casi en cualquier ordenador ``` -- @@ -357,7 +356,7 @@ import("data/raw/surveillance_linelist_20141201.csv") # works on almost any comp -- -**El paso final** es colocar el `here()` comando de ruta del archivo *dentro de* `import()` +**El paso final** es colocar la ruta del archivo del comando `here()` *dentro* de `import()` ```{r, echo=T, eval=F} surv_raw <- import(here("data", "raw", "surveillance_linelist_20141201.csv")) @@ -365,7 +364,7 @@ surv_raw <- import(here("data", "raw", "surveillance_linelist_20141201.csv")) -- -*En `<-` guarda el conjunto de datos como un objeto con el nombre `surv_raw`.* +*El operador de asignación `<-` guarda el conjunto de datos como un objeto con el nombre `surv_raw`.* ??? Los enseñamos aquí() porque elimina la necesidad de manejar barras inclinadas, y es realmente útil cuando llegas a los informes automatizados. @@ -383,12 +382,12 @@ head(surv_raw, 25) %>% options = list( scrollY = 300, scrollX = 600, - pageLength = 25, + pedadLength = 25, fontSize = '25%', dom = "ti", ordering = FALSE, rownames = FALSE, - options = list(pageLength = 5, scrollX=T), + options = list(pedadLength = 5, scrollX=T), class = 'white-space: nowrap' ) ) @@ -405,7 +404,7 @@ class: inverse, center, middle # Demostración en vivo -## Nuevo proyecto RStudio y script R +## Nuevo proyecto de RStudio y script de R ```{r, eval=TRUE, echo=FALSE, out.width="50%"} # Using here() alone won't work because Rmd folder becomes the rendering root. @@ -449,18 +448,12 @@ knitr::include_graphics(xfun::relative_path(here::here("images", "data_cleaning" .pull-right[ -- Prepara el análisis y la visualización - -- Normaliza los nombres de las columnas - -- Subconjuntar filas y columnas - -- Alinear grafías - +- Preparar el análisis y la visualización +- Normalizar los nombres de las columnas +- Indexar filas y columnas +- Homogeneizar escritura - Crear variables categóricas y calculadas - - Unir con otros datos - - Eliminar duplicados... ] @@ -472,7 +465,7 @@ Pregunta a los participantes qué medidas toman para limpiar los conjuntos de da --- -# En {dplyr} paquete +# El paquete {dplyr} .pull-left[ @@ -490,33 +483,33 @@ knitr::include_graphics(xfun::relative_path(here::here("images", "data_cleaning" - El paquete más sencillo y versátil para la limpieza de datos -- Este paquete se instala en un universo de {tidyverse} paquetes R +- Este paquete se instala como parte de un universo de paquetes de R, {tidyverse} -- La página {tidyverse} ha transformado R en los últimos 10 años +- {tidyverse} ha transformado R en los últimos 10 años ] -.nota["dplyr" es la abreviatura de "pinza de datos" - una pinza es la herramienta de mano que aparece en la imagen de arriba] +.nota["dplyr" es la abreviatura de "data plier" (pinza de datos): la pinza en el logo de arriba] ??? Tidyverse ha hecho que la codificación en R sea mucho más fácil de usar, intuitiva y accesible para los codificadores principiantes --- -# Conjunto de datos de práctica +# Base de datos de práctica -Vamos a utilizar un mini **`surv_raw`** conjunto de datos para practicar algunas funciones básicas de R. +Vamos a utilizar una mini base de datos, **`surv_raw`**, para practicar algunas funciones básicas de R. ```{r, echo=F} surv_raw <- data.frame( stringsAsFactors = FALSE, check.names = FALSE, - case_id = c("694928","86340d","92d002","544bd1","544bd1"), - age = c(23L, 0L, 16L, 10L, 10L), - sex = c("m", "f", "m", "f", "f"), - lab_confirmed = c(FALSE, TRUE, TRUE, TRUE, FALSE), - `onset date` = c("11/9/2014", "10/30/2014","8/16/2014","8/29/2014","8/29/2014"), - `wt (kg)` = c(70L, 18L, 59L, 39L, 39L) + id_caso = c("694928","86340d","92d002","544bd1","544bd1"), + edad = c(23L, 0L, 16L, 10L, 10L), + sexo = c("h", "m", "h", "m", "m"), + confirm_lab = c(FALSE, TRUE, TRUE, TRUE, FALSE), + `inicio fecha` = c("11/9/2014", "10/30/2014","8/16/2014","8/29/2014","8/29/2014"), + `peso (kg)` = c(70L, 18L, 59L, 39L, 39L) ) surv_raw <- surv_raw %>% add_row(surv_raw[4,], .before = 5) @@ -534,18 +527,18 @@ surv_raw %>% | Función | Utilidad | | ------- | -------------------------------------- | -| `filter()` | subconjunto **filas** | -| `select()` | subconjunto **columnas** | -| `clean_names()` | normalizar los nombres de las columnas | +| `filter()` | filtrar **filas** | +| `select()` | seleccionar **columnas** | +| `clean_names()` | estandarizar los nombres de las columnas | | `rename()` | renombrar columnas manualmente | | `mutate()` | crear y transformar columnas | -| `mdy()`, `dmy()`, `ymd()` | dile a R cómo entender las fechas | +| `mdy()`, `dmy()`, `ymd()` | indicar a R cómo entender las fechas | --- class: medium-large-table2 -# `filter()` filas +# Filtrar filas: `filter()` .pull-left[ @@ -553,7 +546,7 @@ class: medium-large-table2 filter(surv_raw) ``` -1er argumento: un marco de datos +1er argumento: una base de datos ] @@ -569,22 +562,22 @@ filter(surv_raw) %>% knitr::kable() class: medium-large-table2 -# `filter()` filas +# Filtrar filas: `filter()` .pull-left[ ```{r, eval=F, echo=T} -filter(surv_raw, age < 18) +filter(surv_raw, edad < 18) ``` -2º+ argumentos: pruebas lógicas para que las filas sean *mantener* +2º+ argumentos: pruebas lógicas para *mantener* las filas deseadas ] .pull-right[ ```{r, eval=T, echo=F} -filter(surv_raw, age < 18) %>% knitr::kable() +filter(surv_raw, edad < 18) %>% knitr::kable() ``` ] @@ -593,15 +586,15 @@ filter(surv_raw, age < 18) %>% knitr::kable() class: medium-large-table2 -# `filter()` filas +# Filtrar filas: `filter()` .pull-left[ ```{r, eval=F, echo=T} -filter(surv_raw, age < 18, sex == "f") +filter(surv_raw, edad < 18, sexo == "f") ``` -2º+ argumentos: pruebas lógicas para que las filas sean *mantener* +2º+ argumentos: pruebas lógicas para *mantener* las filas deseadas ] @@ -609,27 +602,27 @@ filter(surv_raw, age < 18, sex == "f") ```{r, eval=T, echo=F} filter(surv_raw, - age < 18, - sex == "f") %>% + edad < 18, + sexo == "m") %>% knitr::kable() ``` ] -.footnote[Observa el uso de doble igual `==` para comprobar la equivalencia]. +.footnote[Observa el uso de doble igual `==` para comprobar la igualdad]. --- class: medium-large-table2 -# `filter()` filas +# Filtrar filas: `filter()` .pull-left[ ```{r, eval=F, echo=T} filter(surv_raw, - age < 18 & - (sex == "f" | lab_confirmed == TRUE) + edad < 18 & + (sexo == "m" | confirm_lab == TRUE) ) ``` @@ -646,7 +639,7 @@ La lógica puede volverse compleja utilizando: .pull-right[ ```{r, eval=T, echo=F} -filter(surv_raw, age < 18 & (sex == "f" | lab_confirmed == TRUE)) %>% +filter(surv_raw, edad < 18 & (sexo == "f" | confirm_lab == TRUE)) %>% knitr::kable() ``` @@ -656,7 +649,7 @@ filter(surv_raw, age < 18 & (sex == "f" | lab_confirmed == TRUE)) %>% class: medium-large-table2 -# `select()` columnas +# Seleccionar columnas: `select()` .pull-left[ @@ -664,7 +657,7 @@ class: medium-large-table2 select(surv_raw, ___) ``` -`select()` también espera un marco de datos como primer argumento +`select()` también espera una base de datos como primer argumento ] @@ -681,22 +674,22 @@ surv_raw %>% class: medium-large-table2 -# `select()` columnas +# Seleccionar columnas: `select()` .pull-left[ ```{r, eval=F, echo=T} -select(surv_raw, case_id, age) +select(surv_raw, id_caso, edad) ``` -Puedes proporcionar `select()` con nombres de columnas a *mantener* +Puedes proporcionar a `select()` los nombres de columnas a *mantener* ] .pull-right[ ```{r, eval=T, echo=F} -select(surv_raw, case_id, age) %>% +select(surv_raw, id_caso, edad) %>% knitr::kable() ``` @@ -706,22 +699,22 @@ select(surv_raw, case_id, age) %>% class: medium-large-table2 -# `select()` columnas +# Seleccionar columnas: `select()` .pull-left[ ```{r, eval=F, echo=T} -select(surv_raw, case_id, age, sex) +select(surv_raw, id_caso, edad, sexo) ``` -Puedes proporcionar `select()` con nombres de columnas a *mantener* +Puedes proporcionar a `select()` los nombres de columnas a *mantener* ] .pull-right[ ```{r, eval=T, echo=F} -select(surv_raw, case_id, age, sex) %>% +select(surv_raw, id_caso, edad, sexo) %>% knitr::kable() ``` @@ -731,12 +724,12 @@ select(surv_raw, case_id, age, sex) %>% class: medium-large-table2 -# `select()` columnas +# Seleccionar columnas: `select()` .pull-left[ ```{r, eval=F, echo=T} -select(surv_raw, -case_id, -lab_confirmed) +select(surv_raw, -id_caso, -confirm_lab) ``` O puedes designar qué columnas *eliminar* con -. @@ -746,7 +739,7 @@ O puedes designar qué columnas *eliminar* con -. .pull-right[ ```{r, eval=T, echo=F} -select(surv_raw, -case_id, -lab_confirmed) %>% +select(surv_raw, -id_caso, -confirm_lab) %>% knitr::kable() ``` @@ -754,20 +747,20 @@ select(surv_raw, -case_id, -lab_confirmed) %>% --- -# `filter()` *y* `select()`? +# ¿`filter()` *y* `select()`? -¡Sí! Utiliza el **%>%** "para "pasar" datos de una función a otra. +¡Sí! Utiliza el **%>%** para "pasar" datos de una función a otra. -.tirar-izquierda\[ +.pull-left[ Es como decir las palabras **"y entonces"**. -Una orden de limpieza típica contiene un *secuencia* de pasos enlazados +Una *secuencia* de limpieza típica contiene una serie de pasos enlazados - Cambiar el nombre de las columnas - Filtrar filas - Seleccionar columnas -- Deduplicar +- Desduplicar - Limpiar valores... ] @@ -788,21 +781,21 @@ knitr::include_graphics(xfun::relative_path(here::here("images", "data_cleaning" class: medium-large-table2 -# Datos de la tubería +# Datos en la "tubería" (secuencia) -Anteriormente, el 1er argumento era el marco de datos +Anteriormente, el 1er argumento era la base de datos -`filter(`**sobrevivir\_sin procesar**`, age < 18)` +`filter(`**surv\_raw**`, edad < 18)` -- Usando tuberías, esto se escribe ahora como -**surv\_raw** `%>% filter(age < 18)` +**surv\_raw** `%>% filter(edad < 18)` -- -Puedes canalizar los datos a través de *múltiples* funciones +Puedes conectar los datos a través de *múltiples* funciones `surv_raw` ```{r, eval=T, echo=F} @@ -813,49 +806,49 @@ surv_raw %>% knitr::kable() class: medium-large-table2 -# Datos de tuberías +# Datos en la "tubería" (secuencia) -Anteriormente, el 1er argumento era el marco de datos +Anteriormente, el 1er argumento era la base de datos -`filter(`**sobrevivir\_sin procesar**`, age < 18)` +`filter(`**surv\_raw**`, edad < 18)` Usando tuberías, esto se escribe ahora como -**surv\_raw** `%>% filter(age < 18)` +**surv\_raw** `%>% filter(edad < 18)` -Puedes canalizar los datos a través de *múltiples* funciones -`surv_raw` **%>%** `filter(age < 18)` +Puedes conectar los datos de `surv_raw` a través de *múltiples* funciones +`surv_raw` **%>%** `filter(edad < 18)` ```{r, eval=T, echo=F} -surv_raw %>% filter(age < 18) %>% knitr::kable() +surv_raw %>% filter(edad < 18) %>% knitr::kable() ``` --- class: medium-large-table2 -# Datos de la tubería +# Datos en la "tubería" (secuencia) -Anteriormente, el 1er argumento era el marco de datos +Anteriormente, el 1er argumento era la base de datos -`filter(`**sobrevivir\_sin procesar**`, age < 18)` +`filter(`**surv\_raw**`, edad < 18)` Usando tuberías, esto se escribe ahora como -**surv\_raw** `%>% filter(age < 18)` +**surv\_raw** `%>% filter(edad < 18)` -Puedes canalizar los datos a través de *múltiples* funciones -`surv_raw` **%>%** `filter(age < 18)` **%>%** `select(case_id, age, sex)` +Puedes conectar los datos de `surv_raw` a través de *múltiples* funciones +`surv_raw` **%>%** `filter(edad < 18)` **%>%** `select(id_caso, edad, sexo)` ```{r, eval=T, echo=F} -surv_raw %>% filter(age < 18) %>% select(case_id, age, sex) %>% knitr::kable() +surv_raw %>% filter(edad < 18) %>% select(id_caso, edad, sexo) %>% knitr::kable() ``` --- # Estilo de codificación vertical -A *vertical* con sangrías no afecta al código, ¡pero lo hace más legible! +Un estilo de codificación *vertical* con *sangrías* no afecta al código, ¡pero lo hace más legible! ```{r, eval=F, echo=T} surv_raw @@ -871,53 +864,53 @@ surv_raw %>% # Estilo de codificación vertical -A *vertical* con sangrías no afecta al código, ¡pero lo hace más legible! +Un estilo de codificación *vertical* con *sangrías* no afecta al código, ¡pero lo hace más legible! ```{r, eval=F, echo=params$lang == "en"} surv_raw %>% - select(case_id, age, sex, lab_confirmed) # select columns + select(id_caso, edad, sexo, confirm_lab) # seleccionar columnas ``` ```{r, eval=F, echo=params$lang == "fr"} surv_raw %>% - select(case_id, age, sex, lab_confirmed) # sélectionner les colonnes + select(id_caso, edad, sexo, confirm_lab) # seleccionner les colonnes ``` ```{r, eval=F, echo=params$lang == "ru"} surv_raw %>% - select(case_id, age, sex, lab_confirmed) # выбрать столбцы + select(id_caso, edad, sexo, confirm_lab) # выбрать столбцы ``` ```{r, eval=F, echo=params$lang == "es"} surv_raw %>% - select(case_id, age, sex, lab_confirmed) # seleccionar columnas + select(id_caso, edad, sexo, confirm_lab) # seleccionar columnas ``` ```{r, eval=params$lang == "en", echo=F} surv_raw %>% #add_row(surv_raw[5,]) %>% - select(case_id, age, sex, lab_confirmed) %>% # select columns + select(id_caso, edad, sexo, confirm_lab) %>% # select columns knitr::kable() ``` ```{r, eval=params$lang == "fr", echo=F} surv_raw %>% add_row(surv_raw[5,]) %>% - select(case_id, age, sex, lab_confirmed) %>% # sélectionner les colonnes + select(id_caso, edad, sexo, confirm_lab) %>% # sélectionner les colonnes knitr::kable() ``` ```{r, eval=params$lang == "ru", echo=F} surv_raw %>% add_row(surv_raw[5,]) %>% - select(case_id, age, sex, lab_confirmed) %>% # выбрать столбцы + select(id_caso, edad, sexo, confirm_lab) %>% # выбрать столбцы knitr::kable() ``` ```{r, eval=params$lang == "es", echo=F} surv_raw %>% #add_row(surv_raw[5,]) %>% - select(case_id, age, sex, lab_confirmed) %>% # de-duplicar + select(id_caso, edad, sexo, confirm_lab) %>% # des-duplicar knitr::kable() ``` @@ -925,36 +918,36 @@ surv_raw %>% # Estilo de codificación vertical -En **`%>%`** pasa el conjunto de datos al siguiente paso +El **`%>%`** pasa el conjunto de datos al siguiente paso ```{r, eval=F, echo=params$lang == "en"} surv_raw %>% - select(case_id, age, sex, lab_confirmed) %>% # select columns + select(id_caso, edad, sexo, confirm_lab) %>% # select columns distinct() # de-duplicate ``` ```{r, eval=F, echo=params$lang == "fr"} surv_raw %>% - select(case_id, age, sex, lab_confirmed) %>% # sélectionner les colonnes + select(id_caso, edad, sexo, confirm_lab) %>% # sélectionner les colonnes distinct() # dédupliquer ``` ```{r, eval=F, echo=params$lang == "ru"} surv_raw %>% - select(case_id, age, sex, lab_confirmed) %>% # выбрать столбцы + select(id_caso, edad, sexo, confirm_lab) %>% # выбрать столбцы distinct() # де-дублировать ``` ```{r, eval=F, echo=params$lang == "es"} surv_raw %>% - select(case_id, age, sex, lab_confirmed) %>% # seleccionar columnas - distinct() # de-duplicar + select(id_caso, edad, sexo, confirm_lab) %>% # seleccionar columnas + distinct() # des-duplicar ``` ```{r, eval=T, echo=F} surv_raw %>% #add_row(surv_raw[5,]) %>% - select(case_id, age, sex, lab_confirmed) %>% # select columns + select(id_caso, edad, sexo, confirm_lab) %>% # select columns distinct() %>% # de-duplicate knitr::kable() ``` @@ -963,42 +956,42 @@ surv_raw %>% # Estilo de codificación vertical -En **`%>%`** pasa el conjunto de datos al siguiente paso +El **`%>%`** pasa la base de datos al siguiente paso ```{r, eval=F, echo=params$lang == "en"} surv_raw %>% - select(case_id, age, sex, lab_confirmed) %>% # select columns + select(id_caso, edad, sexo, confirm_lab) %>% # select columns distinct() %>% # de-duplicate - filter(age < 18, lab_confirmed == TRUE) # only children cases + filter(edad < 18, confirm_lab == TRUE) # only children cases ``` ```{r, eval=F, echo=params$lang == "fr"} surv_raw %>% - select(case_id, age, sex, lab_confirmed) %>% # Sélectionner les colonnes + select(id_caso, edad, sexo, confirm_lab) %>% # Sélectionner les colonnes distinct() %>% # dédupliquer - filter(age < 18, lab_confirmed == TRUE) # uniquement les cas confirmés d'enfants + filter(edad < 18, confirm_lab == TRUE) # uniquement les cas confirmés d'enfants ``` ```{r, eval=F, echo=params$lang == "ru"} surv_raw %>% - select(case_id, age, sex, lab_confirmed) %>% # выбрать столбцы + select(id_caso, edad, sexo, confirm_lab) %>% # выбрать столбцы distinct() %>% # де-дублировать - filter(age < 18, lab_confirmed == TRUE) #подтвержденные случаи заболевания только у маленьких детей + filter(edad < 18, confirm_lab == TRUE) #подтвержденные случаи заболевания только у маленьких детей ``` ```{r, eval=F, echo=params$lang == "es"} surv_raw %>% - select(case_id, age, sex, lab_confirmed) %>% # seleccionar columnas - distinct() %>% # de-duplicar - filter(age < 18, lab_confirmed == TRUE) # sólo los casos confirmados de niños pequeños + select(id_caso, edad, sexo, confirm_lab) %>% # seleccionar columnas + distinct() %>% # des-duplicar + filter(edad < 18, confirm_lab == TRUE) # sólo los casos confirmados de niños pequeños ``` ```{r, eval=T, echo=F} surv_raw %>% #add_row(surv_raw[5,]) %>% - select(case_id, age, sex, lab_confirmed) %>% # select columns - distinct() %>% # de-duplicate - filter(age < 18, lab_confirmed == TRUE) %>% # only children confirmed cases + select(id_caso, edad, sexo, confirm_lab) %>% # select columns + distinct() %>% # des-duplicate + filter(edad < 18, confirm_lab == TRUE) %>% # only children confirmed cases knitr::kable() ``` @@ -1006,51 +999,51 @@ surv_raw %>% # Estilo de codificación vertical -En **`%>%`** pasa el conjunto de datos al siguiente paso +El **`%>%`** pasa la base de datos al siguiente paso ```{r, eval=F, echo=params$lang == "en"} surv_raw %>% - select(case_id, age, sex, lab_confirmed) %>% # select columns + select(id_caso, edad, sexo, confirm_lab) %>% # select columns distinct() %>% # de-duplicate - filter(age < 18, lab_confirmed == TRUE) %>% # only children cases - mutate(infant = ifelse(age < 1, "infant", "not infant")) # create a column + filter(edad < 18, confirm_lab == TRUE) %>% # only children cases + mutate(infant = ifelse(edad < 1, "infant", "not infant")) # create a column ``` ```{r, eval=F, echo=params$lang == "fr"} surv_raw %>% - select(case_id, age, sex, lab_confirmed) %>% # Sélectionner les colonnes + select(id_caso, edad, sexo, confirm_lab) %>% # Sélectionner les colonnes distinct() %>% # dédupliquer - filter(age < 18, lab_confirmed == TRUE) %>% # uniquement les cas confirmés d'enfants - mutate(infant = ifelse(age < 1, "infant", "not infant")) # créer une colonne + filter(edad < 18, confirm_lab == TRUE) %>% # uniquement les cas confirmés d'enfants + mutate(infant = ifelse(edad < 1, "infant", "not infant")) # créer une colonne ``` ```{r, eval=F, echo=params$lang == "ru"} surv_raw %>% - select(case_id, age, sex, lab_confirmed) %>% # выбрать столбцы + select(id_caso, edad, sexo, confirm_lab) %>% # выбрать столбцы distinct() %>% # де-дублировать - filter(age < 18, lab_confirmed == TRUE) %>% # подтвержденные случаи заболевания только у детей младшего возраста - mutate(infant = ifelse(age < 1, "infant", "not infant")) # создать столбец + filter(edad < 18, confirm_lab == TRUE) %>% # подтвержденные случаи заболевания только у детей младшего возраста + mutate(infant = ifelse(edad < 1, "infant", "not infant")) # создать столбец ``` ```{r, eval=F, echo=params$lang == "es"} surv_raw %>% - select(case_id, age, sex, lab_confirmed) %>% # seleccionar columnas - distinct() %>% # de-duplicar - filter(age < 18, lab_confirmed == TRUE) %>% # casos confirmados sólo en niños pequeños - mutate(infant = ifelse(age < 1, "infant", "not infant")) # crear una columna + select(id_caso, edad, sexo, confirm_lab) %>% # seleccionar columnas + distinct() %>% # des-duplicar + filter(edad < 18, confirm_lab == TRUE) %>% # casos confirmados sólo en niños pequeños + mutate(infant = ifelse(edad < 1, "infant", "not infant")) # crear una columna ``` ```{r, eval=T, echo=F} surv_raw %>% #add_row(surv_raw[5,]) %>% - select(case_id, age, sex, lab_confirmed) %>% + select(id_caso, edad, sexo, confirm_lab) %>% distinct() %>% - filter(age < 18, lab_confirmed == TRUE) %>% - mutate(infant = ifelse(age < 1, "infant", "not infant")) %>% + filter(edad < 18, confirm_lab == TRUE) %>% + mutate(infant = ifelse(edad < 1, "infant", "not infant")) %>% knitr::kable() ``` @@ -1058,51 +1051,51 @@ surv_raw %>% # Estilo de codificación vertical -¿Hay un operador de tubería al final de este flujo de trabajo? +¿Hay un operador 'pipe' al final de este flujo de trabajo? ```{r, eval=F, echo=params$lang == "en"} surv_raw %>% - select(case_id, age, sex, lab_confirmed) %>% # select columns + select(id_caso, edad, sexo, confirm_lab) %>% # select columns distinct() %>% # de-duplicate - filter(age < 18, lab_confirmed == TRUE) %>% # only children cases - mutate(infant = ifelse(age < 1, "infant", "not infant")) #<< + filter(edad < 18, confirm_lab == TRUE) %>% # only children cases + mutate(infant = ifelse(edad < 1, "infant", "not infant")) #<< ``` ```{r, eval=F, echo=params$lang == "fr"} surv_raw %>% - select(case_id, age, sex, lab_confirmed) %>% # Sélectionner les colonnes + select(id_caso, edad, sexo, confirm_lab) %>% # Sélectionner les colonnes distinct() %>% # dédupliquer - filter(age < 18, lab_confirmed == TRUE) %>% # uniquement les cas confirmés d'enfants - mutate(infant = ifelse(age < 1, "infant", "not infant")) # créer une colonne + filter(edad < 18, confirm_lab == TRUE) %>% # uniquement les cas confirmés d'enfants + mutate(infant = ifelse(edad < 1, "infant", "not infant")) # créer une colonne ``` ```{r, eval=F, echo=params$lang == "ru"} surv_raw %>% - select(case_id, age, sex, lab_confirmed) %>% # выбрать столбцы + select(id_caso, edad, sexo, confirm_lab) %>% # выбрать столбцы distinct() %>% # де-дублировать - filter(age < 18, lab_confirmed == TRUE) %>% # подтвержденные случаи заболевания только у детей младшего возраста - mutate(infant = ifelse(age < 1, "infant", "not infant")) # создать столбец + filter(edad < 18, confirm_lab == TRUE) %>% # подтвержденные случаи заболевания только у детей младшего возраста + mutate(infant = ifelse(edad < 1, "infant", "not infant")) # создать столбец ``` ```{r, eval=F, echo=params$lang == "es"} surv_raw %>% - select(case_id, age, sex, lab_confirmed) %>% # seleccionar columnas - distinct() %>% # de-duplicar - filter(age < 18, lab_confirmed == TRUE) %>% # casos confirmados sólo en niños pequeños - mutate(infant = ifelse(age < 1, "infant", "not infant")) # crear una columna + select(id_caso, edad, sexo, confirm_lab) %>% # seleccionar columnas + distinct() %>% # des-duplicar + filter(edad < 18, confirm_lab == TRUE) %>% # casos confirmados sólo en niños pequeños + mutate(infant = ifelse(edad < 1, "infant", "not infant")) # crear una columna ``` ```{r, eval=T, echo=F} surv_raw %>% #add_row(surv_raw[5,]) %>% - select(case_id, age, sex, lab_confirmed) %>% + select(id_caso, edad, sexo, confirm_lab) %>% distinct() %>% - filter(age < 18, lab_confirmed == TRUE) %>% - mutate(infant = ifelse(age < 1, "infant", "not infant")) %>% + filter(edad < 18, confirm_lab == TRUE) %>% + mutate(infant = ifelse(edad < 1, "infant", "not infant")) %>% knitr::kable() ``` @@ -1113,70 +1106,72 @@ Las tuberías conectan todas estas funciones en un único comando enlazado. --- -# Limpia los nombres de las columnas +# Nombres de las columnas Podemos observar los cambios en los nombres de las columnas imprimiéndolos con `names()` ```{r, echo=T, eval=T} -# print current column names +# Imprimir los nombres de las columnas actuales names(surv_raw) ``` --- -# Limpia los nombres de las columnas +# Nombres de las columnas -De forma equivalente, `surv_raw` puede pasarse a `names()` utilizando un **tubería**: +De forma equivalente, `surv_raw` puede pasarse a `names()` utilizando un **pipe**: ```{r, echo=T, eval=F} -surv_raw %>% # begin with raw data - names() # print current column names +surv_raw %>% # comienza con los datos crudos + names() # imprime los nombres actuales de las columnas ``` ```{r, eval=T, echo=F} -surv_raw %>% # begin with raw data - names() # print current column names -``` +surv_raw %>% # comienza con los datos crudos + names() # imprime los nombres actuales de las columnas +``` -- -Aplica `clean_names()` a `surv_raw` insertándolo en la secuencia de tuberías. -Así se normalizan los nombres de las columnas (en minúsculas, sin espacios ni caracteres especiales). +Aplica `clean_names()` a `surv_raw` agregándolo en la secuencia. +Así se estandarizan los nombres de las columnas: +en minúsculas, sin espacios ni caracteres especiales. ```{r, echo=T, eval=T} -surv_raw %>% # begin with raw data - clean_names() %>% # standardize column names #<< - names() # print current column names +surv_raw %>% # comienza con los datos crudos + clean_names() %>% # estandariza los nombres de las columnas #<< + names() # imprime los nombres actuales de las columnas ``` *Ver cambios en las dos últimas columnas* --- -# Limpia los nombres de las columnas +# Nombres de las columnas -De forma equivalente, `surv_raw` puede pasarse a `names()` utilizando un **tubería**: +De forma equivalente, `surv_raw` puede pasarse a `names()` utilizando un **pipe**: ```{r, echo=T, eval=F} -surv_raw %>% # begin with raw data - names() # print current column names +surv_raw %>% # comienza con los datos crudos + names() # imprime los nombres actuales de las columnas ``` ```{r, eval=T, echo=F} -surv_raw %>% # begin with raw data - names() # print current column names +surv_raw %>% # comienza con los datos crudos + names() # imprime los nombres actuales de las columnas ``` -A continuación, canaliza el **limpio** a `rename()` para editarlos manualmente. -Ten en cuenta que `rename()` hace referencia a **limpiado** limpios (`onset_date`). +Ahora, incorpora los nombres **limpios** a `rename()` para editarlos manualmente. -```{r, eval=params$lang == "en", echo=params$lang == "en"} -surv_raw %>% # begin with raw data - clean_names() %>% # standardize column names - rename( # manual edits #<< - age_years = age, # NEW = OLD #<< - date_onset = onset_date) %>% #<< - names() # print current column names +Ten en cuenta que `rename()` conecta a los nombres **limpios** (`inicio_fecha`). + +```{r, eval=F, echo=T} +surv_raw %>% # comienza con los datos crudos + clean_names() %>% # estandariza los nombres de las columnas #<< + rename( # edita manualmente #<< + edad_anios = edad, # NUEVO = VIEJO #<< + fecha_inicio = inicio_fecha) %>% #<< + names() # imprime los nombres actuales de las columnas ``` --- @@ -1188,45 +1183,45 @@ Haz clic en las pestañas para ver la diferencia. .panelset[ .panel[.panel-name[Printing] -Los cambios anteriores a `surv_raw` eran **no** salvados. +Los cambios en `surv_raw` **no** fueron guardados. -Sólo *imprimimos con modificaciones*. +Sólo *imprimimos las modificaciones*. -```{r, eval=F, echo=params$lang == "en"} -# modify, then print column names -surv_raw %>% # start with raw data #<< - clean_names() %>% # standardize column names - rename( # manual edits - age_years = age, # NEW = OLD - date_onset = onset_date) %>% - names() # print current column names #<< +```{r, eval=F, echo=T} +# modifica e imprime los nombres de las columnas +surv_raw %>% # comienza con los datos crudos #<< + clean_names() %>% # estandariza los nombres de las columnas + rename( # edita manualmente + edad_anios = edad, # NUEVO = VIEJO + fecha_inicio = inicio_fecha) %>% + names() # imprime los nombres actuales de las columnas #<< ``` -**`surv_raw`** todavía tiene el *nombres originales de las columnas* ¡! +¡**`surv_raw`** todavía tiene los *nombres originales de las columnas*! -```{r, eval=params$lang == "en", echo=params$lang == "en"} +```{r, eval=T, echo=T} names(surv_raw) ``` .panel[.panel-name[Saving] -Utiliza la función **`<-`** para guardar los cambios en un nuevo **`surv_clean`** marco de datos. +Utiliza el operador **`<-`** para guardar los cambios en un nuevo objeto **`surv_clean`**. -No se imprime ninguna salida, pero el nuevo objeto aparecerá en el Entorno RStudio. +Aunque no se imprime nada, el nuevo objeto estará en el Entorno de RStudio. ```{r, eval=T, echo=T} -# create new data frame +# crea una nueva base de datos surv_clean <- surv_raw %>% #<< clean_names() %>% rename( - age_years = age, - date_onset = onset_date) + edad_anios = edad, + fecha_inicio = inicio_fecha) ``` -**`surv_clean`** tiene el *nombres de columna limpios* ¡! +¡**`surv_clean`** tiene ahora los *nombres de las columnas limpios*! -```{r, eval=params$lang == "en", echo=params$lang == "en"} +```{r, eval=T, echo=T} names(surv_clean) ``` @@ -1239,29 +1234,29 @@ names(surv_clean) class: medium-large-table2 -# `mutate()` a *crear* columnas +# Crear columnas: `mutate()` La sintaxis es ```{r, echo=T, eval=F} -DATASET %>% - mutate(NEW_COLUMN_NAME = A_FUNCTION(arguments)) +base_de_datos %>% + mutate(NUEVO_NOMBRE = UNA_FUNCIÓN(argumentos)) ``` .pull-left[ ```{r, echo=T, eval=F} surv_raw %>% - mutate(age_group = ifelse( - test = age >= 18, - yes = "adult", - no = "minor")) + mutate(grupo_etario = ifelse( + test = edad >= 18, + yes = "adulto", + no = "menor")) ``` -`ifelse()` comprueba lógicamente cada fila y escribe en la nueva `age_group` columna: +`ifelse()` comprueba lógicamente cada fila y escribe en la nueva columna `grupo_etario`: -- "adulto" si la prueba es VERDADERA -- "menor" si la prueba es FALSA +- "adulto" si es VERDADERO +- "menor" si es FALSA ] @@ -1269,10 +1264,10 @@ surv_raw %>% ```{r, echo=F, eval=T} surv_raw %>% - mutate(age_group = ifelse( - test = age >= 18, - yes = 'adult', - no = 'minor')) %>% + mutate(grupo_etario = ifelse( + test = edad >= 18, + yes = 'adulto', + no = 'menor')) %>% knitr::kable() ``` @@ -1282,30 +1277,30 @@ surv_raw %>% class: medium-large-table2 -# `mutate()` a *editar* columnas +# Editar columnas con `mutate()` La sintaxis es similar: ```{r, echo=T, eval=F} -DATASET %>% - mutate(SAME_COLUMN_NAME = A_FUNCTION(arguments)) +base_de_datos %>% + mutate(MISMO_NOMBRE_DE_COLUMNA = UNA_FUNCIÓN(argumentos)) ``` .pull-left[ ```{r, echo=T, eval=F} surv_raw %>% - mutate(sex = recode(sex, - "m" = "male", - "f" = "female")) + mutate(sexo = recode(sexo, + "h" = "hombre", + "m" = "mujer")) ``` -Columna `sex` se sobrescribe. +La columna `sexo` se sobrescribe. -`recode()` comienza con el original `sex` y aplica los cambios: +La función `recode()` comienza con el original de `sexo` y aplica los cambios: -- "m" a "hombre" -- "f" a "mujer" +- "h" a "hombre" +- "m" a "mujer" ] @@ -1313,9 +1308,9 @@ Columna `sex` se sobrescribe. ```{r, echo=F, eval=T} surv_raw %>% - mutate(sex = recode(sex, - 'm' = 'male', - 'f' = 'female')) %>% + mutate(sexo = recode(sexo, + 'h' = 'hombre', + 'm' = 'mujer')) %>% knitr::kable() ``` @@ -1323,11 +1318,11 @@ surv_raw %>% --- -# `mutate()` con fechas +# Usando `mutate()` con fechas -En `class()` de las columnas de fecha debe ser "fecha", no "carácter". +Las columnas de fecha han de ser de `class()` "date" (fecha), no "character" (nominal) -Para cambiar la clase, debes *indicar a* R cómo entender las fechas en bruto. +Para cambiar la clase, debes *indicar* a R cómo entender las fechas en bruto. .pull-left[ @@ -1349,13 +1344,13 @@ knitr::include_graphics(xfun::relative_path(here::here("images", "data_cleaning" ] -.footnote\[Más detalles en este [Capítulo del Manual de Epi](https://epirhandbook.com/en/working-with-dates.html)] +.footnote[Más detalles en este [capítulo del Manual de Epi](https://epirhandbook.com/en/working-with-dates.html)] --- # Convertir a clase fecha -En `mutate()` utiliza el botón {lubridate} que se alinea con la función *formato de fecha en bruto*. +En la función `mutate()`, usa {lubridate} para alinear los *formatos de fechas*. - `ymd()` si los valores brutos son AAAA-MM-DD - `dmy()` si los valores brutos son DD-MM-AAAA @@ -1367,7 +1362,7 @@ En `mutate()` utiliza el botón {lubridate} que se alinea con la función *forma ```{r, eval=T, echo=T} surv_clean %>% - select(case_id, date_onset) %>% + select(id_caso, fecha_inicio) %>% tibble() ``` @@ -1379,14 +1374,14 @@ surv_clean %>% ```{r, eval=T, echo=T} surv_clean %>% - mutate(date_onset = mdy(date_onset)) %>% #<< - select(case_id, date_onset) %>% + mutate(fecha_inicio = mdy(fecha_inicio)) %>% #<< + select(id_caso, fecha_inicio) %>% tibble() ``` ] -.footnote[La `tibble()` muestra la clase de cada columna encima de sus valores]. +.footnote[`tibble()` muestra la clase de cada columna encima de sus valores] --- @@ -1394,10 +1389,10 @@ class: inverse, center, middle ## Ejercicio -Ir al sitio web del curso +Ve al sitio web del curso Abre el ejercicio del Módulo 2 e inicia sesión -Sigue las instrucciones para crear un nuevo proyecto RStudio y empieza a programar -Avisa a un instructor si no estás seguro de lo que tienes que hacer +Sigue las instrucciones para crear un nuevo proyecto de RStudio y empieza a programar +Avisa a un/a instructor/a si no estás seguro de lo que tienes que hacer ```{r, eval=TRUE, echo=FALSE, out.width="100%"} # adding xfun::relative_path() creates a dynamic file path between the Rmd location and the here() path. diff --git a/intro/intro02_es/intro02_es.html b/intro/intro02_es/intro02_es.html index 0109b82..cd95f6f 100644 --- a/intro/intro02_es/intro02_es.html +++ b/intro/intro02_es/intro02_es.html @@ -82,7 +82,7 @@ # Introducción a R para </br> Epidemiología Aplicada -### El caso práctico del ébola y la limpieza de datos +### Caso práctico de ébola y limpieza de datos [contact@appliedepi.org](mailto:contact@appliedepi.org) @@ -90,35 +90,35 @@ # Objetivos y calendario -- Crear un nuevo proyecto RStudio para el caso práctico del ébola -- Importa los datos de una subcarpeta del proyecto utilizando `import()` y `here()` -- Familiarizarte con {dplyr} funciones de limpieza de datos -- Empieza a escribir un comando de limpieza utilizando la función `%>%` operador de tubería +- Crear un nuevo proyecto de RStudio para el caso práctico de ébola +- Importar los datos de una subcarpeta del proyecto utilizando `import()` y `here()` +- Familiarizarte con funciones de limpieza de datos {dplyr} +- Empezar a escribir un comando de limpieza utilizando el operador 'pipe' `%>%` </br> -<div class="tabwid"><style>.cl-f59a64e8{}.cl-f587c22a{font-family:'Arial';font-size:11pt;font-weight:normal;font-style:normal;text-decoration:none;color:rgba(0, 0, 0, 1.00);background-color:transparent;}.cl-f58fc434{margin:0;text-align:left;border-bottom: 0 solid rgba(0, 0, 0, 1.00);border-top: 0 solid rgba(0, 0, 0, 1.00);border-left: 0 solid rgba(0, 0, 0, 1.00);border-right: 0 solid rgba(0, 0, 0, 1.00);padding-bottom:5pt;padding-top:5pt;padding-left:5pt;padding-right:5pt;line-height: 1;background-color:transparent;}.cl-f59008e0{width:1.033in;background-color:transparent;vertical-align: middle;border-bottom: 1.5pt solid rgba(102, 102, 102, 1.00);border-top: 1.5pt solid rgba(102, 102, 102, 1.00);border-left: 0 solid rgba(0, 0, 0, 1.00);border-right: 0 solid rgba(0, 0, 0, 1.00);margin-bottom:0;margin-top:0;margin-left:0;margin-right:0;}.cl-f59008f4{width:2.358in;background-color:transparent;vertical-align: middle;border-bottom: 1.5pt solid rgba(102, 102, 102, 1.00);border-top: 1.5pt solid rgba(102, 102, 102, 1.00);border-left: 0 solid rgba(0, 0, 0, 1.00);border-right: 0 solid rgba(0, 0, 0, 1.00);margin-bottom:0;margin-top:0;margin-left:0;margin-right:0;}.cl-f59008f5{width:1.033in;background-color:transparent;vertical-align: middle;border-bottom: 0 solid rgba(0, 0, 0, 1.00);border-top: 0 solid rgba(0, 0, 0, 1.00);border-left: 0 solid rgba(0, 0, 0, 1.00);border-right: 0 solid rgba(0, 0, 0, 1.00);margin-bottom:0;margin-top:0;margin-left:0;margin-right:0;}.cl-f59008fe{width:2.358in;background-color:transparent;vertical-align: middle;border-bottom: 0 solid rgba(0, 0, 0, 1.00);border-top: 0 solid rgba(0, 0, 0, 1.00);border-left: 0 solid rgba(0, 0, 0, 1.00);border-right: 0 solid rgba(0, 0, 0, 1.00);margin-bottom:0;margin-top:0;margin-left:0;margin-right:0;}.cl-f59008ff{width:1.033in;background-color:transparent;vertical-align: middle;border-bottom: 0 solid rgba(0, 0, 0, 1.00);border-top: 0 solid rgba(0, 0, 0, 1.00);border-left: 0 solid rgba(0, 0, 0, 1.00);border-right: 0 solid rgba(0, 0, 0, 1.00);margin-bottom:0;margin-top:0;margin-left:0;margin-right:0;}.cl-f5900908{width:2.358in;background-color:transparent;vertical-align: middle;border-bottom: 0 solid rgba(0, 0, 0, 1.00);border-top: 0 solid rgba(0, 0, 0, 1.00);border-left: 0 solid rgba(0, 0, 0, 1.00);border-right: 0 solid rgba(0, 0, 0, 1.00);margin-bottom:0;margin-top:0;margin-left:0;margin-right:0;}.cl-f5900909{width:1.033in;background-color:transparent;vertical-align: middle;border-bottom: 1.5pt solid rgba(102, 102, 102, 1.00);border-top: 0 solid rgba(0, 0, 0, 1.00);border-left: 0 solid rgba(0, 0, 0, 1.00);border-right: 0 solid rgba(0, 0, 0, 1.00);margin-bottom:0;margin-top:0;margin-left:0;margin-right:0;}.cl-f5900912{width:2.358in;background-color:transparent;vertical-align: middle;border-bottom: 1.5pt solid rgba(102, 102, 102, 1.00);border-top: 0 solid rgba(0, 0, 0, 1.00);border-left: 0 solid rgba(0, 0, 0, 1.00);border-right: 0 solid rgba(0, 0, 0, 1.00);margin-bottom:0;margin-top:0;margin-left:0;margin-right:0;}.cl-f5900913{width:1.033in;background-color:transparent;vertical-align: middle;border-bottom: 0 solid rgba(255, 255, 255, 0.00);border-top: 0 solid rgba(255, 255, 255, 0.00);border-left: 0 solid rgba(255, 255, 255, 0.00);border-right: 0 solid rgba(255, 255, 255, 0.00);margin-bottom:0;margin-top:0;margin-left:0;margin-right:0;}.cl-f590091c{width:2.358in;background-color:transparent;vertical-align: middle;border-bottom: 0 solid rgba(255, 255, 255, 0.00);border-top: 0 solid rgba(255, 255, 255, 0.00);border-left: 0 solid rgba(255, 255, 255, 0.00);border-right: 0 solid rgba(255, 255, 255, 0.00);margin-bottom:0;margin-top:0;margin-left:0;margin-right:0;}</style><table data-quarto-disable-processing='true' class='cl-f59a64e8'><thead><tr style="overflow-wrap:break-word;"><th class="cl-f59008e0"><p class="cl-f58fc434"><span class="cl-f587c22a">Time</span></p></th><th class="cl-f59008f4"><p class="cl-f58fc434"><span class="cl-f587c22a">Topic</span></p></th></tr></thead><tbody><tr style="overflow-wrap:break-word;"><td class="cl-f59008f5"><p class="cl-f58fc434"><span class="cl-f587c22a">10 minutes</span></p></td><td class="cl-f59008fe"><p class="cl-f58fc434"><span class="cl-f587c22a">Set up of the Ebola case study</span></p></td></tr><tr style="overflow-wrap:break-word;"><td class="cl-f59008f5"><p class="cl-f58fc434"><span class="cl-f587c22a">20 minutes</span></p></td><td class="cl-f59008fe"><p class="cl-f58fc434"><span class="cl-f587c22a">Functions for data cleaning</span></p></td></tr><tr style="overflow-wrap:break-word;"><td class="cl-f59008f5"><p class="cl-f58fc434"><span class="cl-f587c22a">10 minutes</span></p></td><td class="cl-f59008fe"><p class="cl-f58fc434"><span class="cl-f587c22a">Demo of data cleaning</span></p></td></tr><tr style="overflow-wrap:break-word;"><td class="cl-f59008ff"><p class="cl-f58fc434"><span class="cl-f587c22a">2 hours</span></p></td><td class="cl-f5900908"><p class="cl-f58fc434"><span class="cl-f587c22a">Exercise</span></p></td></tr><tr style="overflow-wrap:break-word;"><td class="cl-f5900909"><p class="cl-f58fc434"><span class="cl-f587c22a">20 minutes</span></p></td><td class="cl-f5900912"><p class="cl-f58fc434"><span class="cl-f587c22a">Debrief</span></p></td></tr></tbody><tfoot><tr style="overflow-wrap:break-word;"><td colspan="2"class="cl-f5900913"><p class="cl-f58fc434"><span class="cl-f587c22a">Take breaks as you wish during the exercise</span></p></td></tr></tfoot></table></div> +<div class="tabwid"><style>.cl-333e10c6{}.cl-33393128{font-family:'DejaVu Sans';font-size:11pt;font-weight:normal;font-style:normal;text-decoration:none;color:rgba(0, 0, 0, 1.00);background-color:transparent;}.cl-333b66fa{margin:0;text-align:left;border-bottom: 0 solid rgba(0, 0, 0, 1.00);border-top: 0 solid rgba(0, 0, 0, 1.00);border-left: 0 solid rgba(0, 0, 0, 1.00);border-right: 0 solid rgba(0, 0, 0, 1.00);padding-bottom:5pt;padding-top:5pt;padding-left:5pt;padding-right:5pt;line-height: 1;background-color:transparent;}.cl-333b74b0{width:1.146in;background-color:transparent;vertical-align: middle;border-bottom: 1.5pt solid rgba(102, 102, 102, 1.00);border-top: 1.5pt solid rgba(102, 102, 102, 1.00);border-left: 0 solid rgba(0, 0, 0, 1.00);border-right: 0 solid rgba(0, 0, 0, 1.00);margin-bottom:0;margin-top:0;margin-left:0;margin-right:0;}.cl-333b74b1{width:3.171in;background-color:transparent;vertical-align: middle;border-bottom: 1.5pt solid rgba(102, 102, 102, 1.00);border-top: 1.5pt solid rgba(102, 102, 102, 1.00);border-left: 0 solid rgba(0, 0, 0, 1.00);border-right: 0 solid rgba(0, 0, 0, 1.00);margin-bottom:0;margin-top:0;margin-left:0;margin-right:0;}.cl-333b74ba{width:1.146in;background-color:transparent;vertical-align: middle;border-bottom: 0 solid rgba(0, 0, 0, 1.00);border-top: 0 solid rgba(0, 0, 0, 1.00);border-left: 0 solid rgba(0, 0, 0, 1.00);border-right: 0 solid rgba(0, 0, 0, 1.00);margin-bottom:0;margin-top:0;margin-left:0;margin-right:0;}.cl-333b74bb{width:3.171in;background-color:transparent;vertical-align: middle;border-bottom: 0 solid rgba(0, 0, 0, 1.00);border-top: 0 solid rgba(0, 0, 0, 1.00);border-left: 0 solid rgba(0, 0, 0, 1.00);border-right: 0 solid rgba(0, 0, 0, 1.00);margin-bottom:0;margin-top:0;margin-left:0;margin-right:0;}.cl-333b74bc{width:1.146in;background-color:transparent;vertical-align: middle;border-bottom: 0 solid rgba(0, 0, 0, 1.00);border-top: 0 solid rgba(0, 0, 0, 1.00);border-left: 0 solid rgba(0, 0, 0, 1.00);border-right: 0 solid rgba(0, 0, 0, 1.00);margin-bottom:0;margin-top:0;margin-left:0;margin-right:0;}.cl-333b74c4{width:3.171in;background-color:transparent;vertical-align: middle;border-bottom: 0 solid rgba(0, 0, 0, 1.00);border-top: 0 solid rgba(0, 0, 0, 1.00);border-left: 0 solid rgba(0, 0, 0, 1.00);border-right: 0 solid rgba(0, 0, 0, 1.00);margin-bottom:0;margin-top:0;margin-left:0;margin-right:0;}.cl-333b74c5{width:1.146in;background-color:transparent;vertical-align: middle;border-bottom: 1.5pt solid rgba(102, 102, 102, 1.00);border-top: 0 solid rgba(0, 0, 0, 1.00);border-left: 0 solid rgba(0, 0, 0, 1.00);border-right: 0 solid rgba(0, 0, 0, 1.00);margin-bottom:0;margin-top:0;margin-left:0;margin-right:0;}.cl-333b74c6{width:3.171in;background-color:transparent;vertical-align: middle;border-bottom: 1.5pt solid rgba(102, 102, 102, 1.00);border-top: 0 solid rgba(0, 0, 0, 1.00);border-left: 0 solid rgba(0, 0, 0, 1.00);border-right: 0 solid rgba(0, 0, 0, 1.00);margin-bottom:0;margin-top:0;margin-left:0;margin-right:0;}.cl-333b74ce{width:1.146in;background-color:transparent;vertical-align: middle;border-bottom: 0 solid rgba(255, 255, 255, 0.00);border-top: 0 solid rgba(255, 255, 255, 0.00);border-left: 0 solid rgba(255, 255, 255, 0.00);border-right: 0 solid rgba(255, 255, 255, 0.00);margin-bottom:0;margin-top:0;margin-left:0;margin-right:0;}.cl-333b74cf{width:3.171in;background-color:transparent;vertical-align: middle;border-bottom: 0 solid rgba(255, 255, 255, 0.00);border-top: 0 solid rgba(255, 255, 255, 0.00);border-left: 0 solid rgba(255, 255, 255, 0.00);border-right: 0 solid rgba(255, 255, 255, 0.00);margin-bottom:0;margin-top:0;margin-left:0;margin-right:0;}</style><table data-quarto-disable-processing='true' class='cl-333e10c6'><thead><tr style="overflow-wrap:break-word;"><th class="cl-333b74b0"><p class="cl-333b66fa"><span class="cl-33393128">Time</span></p></th><th class="cl-333b74b1"><p class="cl-333b66fa"><span class="cl-33393128">Topic</span></p></th></tr></thead><tbody><tr style="overflow-wrap:break-word;"><td class="cl-333b74ba"><p class="cl-333b66fa"><span class="cl-33393128">10 minutos</span></p></td><td class="cl-333b74bb"><p class="cl-333b66fa"><span class="cl-33393128">Introducir el caso de estudio de ébola</span></p></td></tr><tr style="overflow-wrap:break-word;"><td class="cl-333b74bc"><p class="cl-333b66fa"><span class="cl-33393128">20 minutos</span></p></td><td class="cl-333b74c4"><p class="cl-333b66fa"><span class="cl-33393128">Funciones para limpieza de datos</span></p></td></tr><tr style="overflow-wrap:break-word;"><td class="cl-333b74bc"><p class="cl-333b66fa"><span class="cl-33393128">10 minutos</span></p></td><td class="cl-333b74c4"><p class="cl-333b66fa"><span class="cl-33393128">Demo de limpieza de datos</span></p></td></tr><tr style="overflow-wrap:break-word;"><td class="cl-333b74bc"><p class="cl-333b66fa"><span class="cl-33393128">2 horas</span></p></td><td class="cl-333b74c4"><p class="cl-333b66fa"><span class="cl-33393128">Ejercicio</span></p></td></tr><tr style="overflow-wrap:break-word;"><td class="cl-333b74c5"><p class="cl-333b66fa"><span class="cl-33393128">20 minutos</span></p></td><td class="cl-333b74c6"><p class="cl-333b66fa"><span class="cl-33393128">Devolución</span></p></td></tr></tbody><tfoot><tr style="overflow-wrap:break-word;"><td colspan="2"class="cl-333b74ce"><p class="cl-333b66fa"><span class="cl-33393128">Toma las pausas que necesites durante el ejercicio</span></p></td></tr></tfoot></table></div> ??? Fíjate en las pausas de estiramiento. --- -# Revisa +# Agenda - **Proyectos RStudio** - un hogar para los datos y scripts de un análisis concreto -- -- Ejecutar comandos en **un script de R**, con comentarios +- Ejecutar comandos en **un script de R** usando comentarios -- -- Creando **objetos** con el operador de asignación **`<-`** +- Crear **objetos** con el operador de asignación **`<-`** -- -- Utilizando **funciones** como `max()`, `min()` y `paste()` +- Utilizar **funciones** como `max()`, `min()` y `paste()` -- @@ -130,15 +130,15 @@ -- -- Las columnas tienen **clases** que pueden comprobarse con `class()` +- Comprobar la **clase** de las columnas `class()` --- class: inverse, center, middle -# El caso práctico del ébola +# El caso de estudio: el brote de ébola -Los módulos 2-8 utilizarán datos de un brote simulado de ébola en Sierra Leona. +Los módulos 2 a 8 utilizarán datos de un brote simulado de ébola en Sierra Leona. --- @@ -146,7 +146,7 @@ .pull-left[ -El ejercicio te guiará para crear un nuevo **proyecto RStudio** en la carpeta "intro\_curso/**ébola**/". +El ejercicio te guiará para crear un nuevo **proyecto de RStudio** en la carpeta "intro\_curso/**ebola**/". <img src="../../images/functions_packages/project_briefcase.png" width="85%" /> @@ -156,23 +156,23 @@ 📁 intro\_curso -- 📂 módulo1 +- 📁 modulo1 - 📂 covid -- **📁 ébola** +- **📂 ebola** - **ebola.Rproj** - - 📁 datos + - 📂 datos - 📁 salidas - - 📂 guiones + - 📂 scripts ] --- -# Un nuevo R Script +# Un nuevo Script de R .pull-left[ -Escribirás un nuevo script de R llamado "ebola\_análisis.R" para guardar tus comandos. +Escribirás un nuevo script de R llamado "ebola\_analisis.R" para guardar tus comandos. El script se guardará en la subcarpeta "ebola/**scripts**/" @@ -182,16 +182,16 @@ .pull-right[ -📁 intro\_curso +📂 intro\_curso -- 📁 módulo1 -- 📁 covid -- 📁 **ébola** +- 📂 modulo1 +- 📂 covid +- 📂 **ebola** - **ebola.Rproj** - 📁 datos - 📂 salidas - - 📂 **guiones** - - **análisis\_ébola.R** + - 📁 **scripts** + - **analisis\_ebola.R** ] @@ -208,34 +208,33 @@ ```r pacman::p_load( - rio, # for importing data - here, # for relative file paths - skimr, # for reviewing the data - janitor, # for cleaning data - epikit, # for creating age categories - tidyverse # for data management and visualization + rio, # para importar datos + here, # para rutas relativas para localizar arhivos + skimr, # para revisar los datos + janitor, # para limpieza de datos + epikit, # para crear categorías de edad + tidyverse # para manejo de datos y visualización ) ``` --- -# Importar datos de una subcarpeta - -La lista de líneas del ébola se guarda en la subcarpeta "**datos**/**en bruto**/": +# Importar desde una subcarpeta -📁 **ébola** +El listado de casos de ébola se guarda en la subcarpeta "**datos**/**brutos**/": +📂 **ebola** - ebola.Rproj -- 📂 **datos** - - 📁 limpia - - 📂 **en bruto** +- 📁 **datos** + - 📁 limpios + - 📂 **brutos** - **surveillance\_linelist\_20141201.csv** - 📂 scripts -- 📂 salidas +- 📁 salidas -`import()` espera un *ruta de archivo* - la ubicación o "dirección" de los datos en tu ordenador. +`import()` espera un *ruta de archivo*: la ubicación o "dirección" de los datos -¿Funcionará este comando para importar la lista de líneas del Ébola? +¿Funcionará este comando para importar el listado de casos de ébola? ```r @@ -244,13 +243,13 @@ -- -**No** tienes que especificar qué *subcarpeta* del proyecto se guardan los datos. +**No**, tienes que especificar en qué *subcarpeta* del proyecto se guardan los datos. --- # Rutas de los archivos -**Evita** la frágil ruta de archivo "absoluta *(sólo funciona en un ordenador)* +**Evita** la frágil ruta de archivo "absoluta" *(sólo funciona en un ordenador)* ```r @@ -263,7 +262,7 @@ ```r -import("data/raw/surveillance_linelist_20141201.csv") # works on almost any computer +import("data/raw/surveillance_linelist_20141201.csv") # funciona casi en cualquier ordenador ``` -- @@ -274,7 +273,7 @@ -- -**El paso final** es colocar el `here()` comando de ruta del archivo *dentro de* `import()` +**El paso final** es colocar la ruta del archivo del comando `here()` *dentro* de `import()` ```r @@ -283,7 +282,7 @@ -- -*En `<-` guarda el conjunto de datos como un objeto con el nombre `surv_raw`.* +*El operador de asignación `<-` guarda el conjunto de datos como un objeto con el nombre `surv_raw`.* ??? Los enseñamos aquí() porque elimina la necesidad de manejar barras inclinadas, y es realmente útil cuando llegas a los informes automatizados. @@ -294,8 +293,8 @@ # Los datos -
- +
+ .nota[Aquí sólo se muestran 25 filas] @@ -308,7 +307,7 @@ # Demostración en vivo -## Nuevo proyecto RStudio y script R +## Nuevo proyecto de RStudio y script de R <img src="../../images/functions_packages/piano_man.jpg" width="50%" /> @@ -336,18 +335,12 @@ .pull-right[ -- Prepara el análisis y la visualización - -- Normaliza los nombres de las columnas - -- Subconjuntar filas y columnas - -- Alinear grafías - +- Preparar el análisis y la visualización +- Normalizar los nombres de las columnas +- Indexar filas y columnas +- Homogeneizar escritura - Crear variables categóricas y calculadas - - Unir con otros datos - - Eliminar duplicados... ] @@ -359,7 +352,7 @@ --- -# En {dplyr} paquete +# El paquete {dplyr} .pull-left[ @@ -371,41 +364,41 @@ - El paquete más sencillo y versátil para la limpieza de datos -- Este paquete se instala en un universo de {tidyverse} paquetes R +- Este paquete se instala como parte de un universo de paquetes de R, {tidyverse} -- La página {tidyverse} ha transformado R en los últimos 10 años +- {tidyverse} ha transformado R en los últimos 10 años ] -.nota["dplyr" es la abreviatura de "pinza de datos" - una pinza es la herramienta de mano que aparece en la imagen de arriba] +.nota["dplyr" es la abreviatura de "data plier" (pinza de datos): la pinza en el logo de arriba] ??? Tidyverse ha hecho que la codificación en R sea mucho más fácil de usar, intuitiva y accesible para los codificadores principiantes --- -# Conjunto de datos de práctica +# Base de datos de práctica -Vamos a utilizar un mini **`surv_raw`** conjunto de datos para practicar algunas funciones básicas de R. +Vamos a utilizar una mini base de datos, **`surv_raw`**, para practicar algunas funciones básicas de R. <table> <thead> <tr> - <th style="text-align:left;"> case_id </th> - <th style="text-align:right;"> age </th> - <th style="text-align:left;"> sex </th> - <th style="text-align:left;"> lab_confirmed </th> - <th style="text-align:left;"> onset date </th> - <th style="text-align:right;"> wt (kg) </th> + <th style="text-align:left;"> id_caso </th> + <th style="text-align:right;"> edad </th> + <th style="text-align:left;"> sexo </th> + <th style="text-align:left;"> confirm_lab </th> + <th style="text-align:left;"> inicio fecha </th> + <th style="text-align:right;"> peso (kg) </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> 694928 </td> <td style="text-align:right;"> 23 </td> - <td style="text-align:left;"> m </td> + <td style="text-align:left;"> h </td> <td style="text-align:left;"> FALSE </td> <td style="text-align:left;"> 11/9/2014 </td> <td style="text-align:right;"> 70 </td> @@ -413,7 +406,7 @@ <tr> <td style="text-align:left;"> 86340d </td> <td style="text-align:right;"> 0 </td> - <td style="text-align:left;"> f </td> + <td style="text-align:left;"> m </td> <td style="text-align:left;"> TRUE </td> <td style="text-align:left;"> 10/30/2014 </td> <td style="text-align:right;"> 18 </td> @@ -421,7 +414,7 @@ <tr> <td style="text-align:left;"> 92d002 </td> <td style="text-align:right;"> 16 </td> - <td style="text-align:left;"> m </td> + <td style="text-align:left;"> h </td> <td style="text-align:left;"> TRUE </td> <td style="text-align:left;"> 8/16/2014 </td> <td style="text-align:right;"> 59 </td> @@ -429,7 +422,7 @@ <tr> <td style="text-align:left;"> 544bd1 </td> <td style="text-align:right;"> 10 </td> - <td style="text-align:left;"> f </td> + <td style="text-align:left;"> m </td> <td style="text-align:left;"> TRUE </td> <td style="text-align:left;"> 8/29/2014 </td> <td style="text-align:right;"> 39 </td> @@ -437,7 +430,7 @@ <tr> <td style="text-align:left;"> 544bd1 </td> <td style="text-align:right;"> 10 </td> - <td style="text-align:left;"> f </td> + <td style="text-align:left;"> m </td> <td style="text-align:left;"> TRUE </td> <td style="text-align:left;"> 8/29/2014 </td> <td style="text-align:right;"> 39 </td> @@ -445,7 +438,7 @@ <tr> <td style="text-align:left;"> 544bd1 </td> <td style="text-align:right;"> 10 </td> - <td style="text-align:left;"> f </td> + <td style="text-align:left;"> m </td> <td style="text-align:left;"> FALSE </td> <td style="text-align:left;"> 8/29/2014 </td> <td style="text-align:right;"> 39 </td> @@ -459,18 +452,18 @@ | Función | Utilidad | | ------- | -------------------------------------- | -| `filter()` | subconjunto **filas** | -| `select()` | subconjunto **columnas** | -| `clean_names()` | normalizar los nombres de las columnas | +| `filter()` | filtrar **filas** | +| `select()` | seleccionar **columnas** | +| `clean_names()` | estandarizar los nombres de las columnas | | `rename()` | renombrar columnas manualmente | | `mutate()` | crear y transformar columnas | -| `mdy()`, `dmy()`, `ymd()` | dile a R cómo entender las fechas | +| `mdy()`, `dmy()`, `ymd()` | indicar a R cómo entender las fechas | --- class: medium-large-table2 -# `filter()` filas +# Filtrar filas: `filter()` .pull-left[ @@ -479,7 +472,7 @@ filter(surv_raw) ``` -1er argumento: un marco de datos +1er argumento: una base de datos ] @@ -488,19 +481,19 @@ <table> <thead> <tr> - <th style="text-align:left;"> case_id </th> - <th style="text-align:right;"> age </th> - <th style="text-align:left;"> sex </th> - <th style="text-align:left;"> lab_confirmed </th> - <th style="text-align:left;"> onset date </th> - <th style="text-align:right;"> wt (kg) </th> + <th style="text-align:left;"> id_caso </th> + <th style="text-align:right;"> edad </th> + <th style="text-align:left;"> sexo </th> + <th style="text-align:left;"> confirm_lab </th> + <th style="text-align:left;"> inicio fecha </th> + <th style="text-align:right;"> peso (kg) </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> 694928 </td> <td style="text-align:right;"> 23 </td> - <td style="text-align:left;"> m </td> + <td style="text-align:left;"> h </td> <td style="text-align:left;"> FALSE </td> <td style="text-align:left;"> 11/9/2014 </td> <td style="text-align:right;"> 70 </td> @@ -508,7 +501,7 @@ <tr> <td style="text-align:left;"> 86340d </td> <td style="text-align:right;"> 0 </td> - <td style="text-align:left;"> f </td> + <td style="text-align:left;"> m </td> <td style="text-align:left;"> TRUE </td> <td style="text-align:left;"> 10/30/2014 </td> <td style="text-align:right;"> 18 </td> @@ -516,7 +509,7 @@ <tr> <td style="text-align:left;"> 92d002 </td> <td style="text-align:right;"> 16 </td> - <td style="text-align:left;"> m </td> + <td style="text-align:left;"> h </td> <td style="text-align:left;"> TRUE </td> <td style="text-align:left;"> 8/16/2014 </td> <td style="text-align:right;"> 59 </td> @@ -524,7 +517,7 @@ <tr> <td style="text-align:left;"> 544bd1 </td> <td style="text-align:right;"> 10 </td> - <td style="text-align:left;"> f </td> + <td style="text-align:left;"> m </td> <td style="text-align:left;"> TRUE </td> <td style="text-align:left;"> 8/29/2014 </td> <td style="text-align:right;"> 39 </td> @@ -532,7 +525,7 @@ <tr> <td style="text-align:left;"> 544bd1 </td> <td style="text-align:right;"> 10 </td> - <td style="text-align:left;"> f </td> + <td style="text-align:left;"> m </td> <td style="text-align:left;"> TRUE </td> <td style="text-align:left;"> 8/29/2014 </td> <td style="text-align:right;"> 39 </td> @@ -540,7 +533,7 @@ <tr> <td style="text-align:left;"> 544bd1 </td> <td style="text-align:right;"> 10 </td> - <td style="text-align:left;"> f </td> + <td style="text-align:left;"> m </td> <td style="text-align:left;"> FALSE </td> <td style="text-align:left;"> 8/29/2014 </td> <td style="text-align:right;"> 39 </td> @@ -554,16 +547,16 @@ class: medium-large-table2 -# `filter()` filas +# Filtrar filas: `filter()` .pull-left[ ```r -filter(surv_raw, age < 18) +filter(surv_raw, edad < 18) ``` -2º+ argumentos: pruebas lógicas para que las filas sean *mantener* +2º+ argumentos: pruebas lógicas para *mantener* las filas deseadas ] @@ -572,19 +565,19 @@ <table> <thead> <tr> - <th style="text-align:left;"> case_id </th> - <th style="text-align:right;"> age </th> - <th style="text-align:left;"> sex </th> - <th style="text-align:left;"> lab_confirmed </th> - <th style="text-align:left;"> onset date </th> - <th style="text-align:right;"> wt (kg) </th> + <th style="text-align:left;"> id_caso </th> + <th style="text-align:right;"> edad </th> + <th style="text-align:left;"> sexo </th> + <th style="text-align:left;"> confirm_lab </th> + <th style="text-align:left;"> inicio fecha </th> + <th style="text-align:right;"> peso (kg) </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> 86340d </td> <td style="text-align:right;"> 0 </td> - <td style="text-align:left;"> f </td> + <td style="text-align:left;"> m </td> <td style="text-align:left;"> TRUE </td> <td style="text-align:left;"> 10/30/2014 </td> <td style="text-align:right;"> 18 </td> @@ -592,7 +585,7 @@ <tr> <td style="text-align:left;"> 92d002 </td> <td style="text-align:right;"> 16 </td> - <td style="text-align:left;"> m </td> + <td style="text-align:left;"> h </td> <td style="text-align:left;"> TRUE </td> <td style="text-align:left;"> 8/16/2014 </td> <td style="text-align:right;"> 59 </td> @@ -600,7 +593,7 @@ <tr> <td style="text-align:left;"> 544bd1 </td> <td style="text-align:right;"> 10 </td> - <td style="text-align:left;"> f </td> + <td style="text-align:left;"> m </td> <td style="text-align:left;"> TRUE </td> <td style="text-align:left;"> 8/29/2014 </td> <td style="text-align:right;"> 39 </td> @@ -608,7 +601,7 @@ <tr> <td style="text-align:left;"> 544bd1 </td> <td style="text-align:right;"> 10 </td> - <td style="text-align:left;"> f </td> + <td style="text-align:left;"> m </td> <td style="text-align:left;"> TRUE </td> <td style="text-align:left;"> 8/29/2014 </td> <td style="text-align:right;"> 39 </td> @@ -616,7 +609,7 @@ <tr> <td style="text-align:left;"> 544bd1 </td> <td style="text-align:right;"> 10 </td> - <td style="text-align:left;"> f </td> + <td style="text-align:left;"> m </td> <td style="text-align:left;"> FALSE </td> <td style="text-align:left;"> 8/29/2014 </td> <td style="text-align:right;"> 39 </td> @@ -630,16 +623,16 @@ class: medium-large-table2 -# `filter()` filas +# Filtrar filas: `filter()` .pull-left[ ```r -filter(surv_raw, age < 18, sex == "f") +filter(surv_raw, edad < 18, sexo == "f") ``` -2º+ argumentos: pruebas lógicas para que las filas sean *mantener* +2º+ argumentos: pruebas lógicas para *mantener* las filas deseadas ] @@ -648,19 +641,19 @@ <table> <thead> <tr> - <th style="text-align:left;"> case_id </th> - <th style="text-align:right;"> age </th> - <th style="text-align:left;"> sex </th> - <th style="text-align:left;"> lab_confirmed </th> - <th style="text-align:left;"> onset date </th> - <th style="text-align:right;"> wt (kg) </th> + <th style="text-align:left;"> id_caso </th> + <th style="text-align:right;"> edad </th> + <th style="text-align:left;"> sexo </th> + <th style="text-align:left;"> confirm_lab </th> + <th style="text-align:left;"> inicio fecha </th> + <th style="text-align:right;"> peso (kg) </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> 86340d </td> <td style="text-align:right;"> 0 </td> - <td style="text-align:left;"> f </td> + <td style="text-align:left;"> m </td> <td style="text-align:left;"> TRUE </td> <td style="text-align:left;"> 10/30/2014 </td> <td style="text-align:right;"> 18 </td> @@ -668,7 +661,7 @@ <tr> <td style="text-align:left;"> 544bd1 </td> <td style="text-align:right;"> 10 </td> - <td style="text-align:left;"> f </td> + <td style="text-align:left;"> m </td> <td style="text-align:left;"> TRUE </td> <td style="text-align:left;"> 8/29/2014 </td> <td style="text-align:right;"> 39 </td> @@ -676,7 +669,7 @@ <tr> <td style="text-align:left;"> 544bd1 </td> <td style="text-align:right;"> 10 </td> - <td style="text-align:left;"> f </td> + <td style="text-align:left;"> m </td> <td style="text-align:left;"> TRUE </td> <td style="text-align:left;"> 8/29/2014 </td> <td style="text-align:right;"> 39 </td> @@ -684,7 +677,7 @@ <tr> <td style="text-align:left;"> 544bd1 </td> <td style="text-align:right;"> 10 </td> - <td style="text-align:left;"> f </td> + <td style="text-align:left;"> m </td> <td style="text-align:left;"> FALSE </td> <td style="text-align:left;"> 8/29/2014 </td> <td style="text-align:right;"> 39 </td> @@ -694,21 +687,21 @@ ] -.footnote[Observa el uso de doble igual `==` para comprobar la equivalencia]. +.footnote[Observa el uso de doble igual `==` para comprobar la igualdad]. --- class: medium-large-table2 -# `filter()` filas +# Filtrar filas: `filter()` .pull-left[ ```r filter(surv_raw, - age < 18 & - (sex == "f" | lab_confirmed == TRUE) + edad < 18 & + (sexo == "m" | confirm_lab == TRUE) ) ``` @@ -727,19 +720,19 @@ <table> <thead> <tr> - <th style="text-align:left;"> case_id </th> - <th style="text-align:right;"> age </th> - <th style="text-align:left;"> sex </th> - <th style="text-align:left;"> lab_confirmed </th> - <th style="text-align:left;"> onset date </th> - <th style="text-align:right;"> wt (kg) </th> + <th style="text-align:left;"> id_caso </th> + <th style="text-align:right;"> edad </th> + <th style="text-align:left;"> sexo </th> + <th style="text-align:left;"> confirm_lab </th> + <th style="text-align:left;"> inicio fecha </th> + <th style="text-align:right;"> peso (kg) </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> 86340d </td> <td style="text-align:right;"> 0 </td> - <td style="text-align:left;"> f </td> + <td style="text-align:left;"> m </td> <td style="text-align:left;"> TRUE </td> <td style="text-align:left;"> 10/30/2014 </td> <td style="text-align:right;"> 18 </td> @@ -747,7 +740,7 @@ <tr> <td style="text-align:left;"> 92d002 </td> <td style="text-align:right;"> 16 </td> - <td style="text-align:left;"> m </td> + <td style="text-align:left;"> h </td> <td style="text-align:left;"> TRUE </td> <td style="text-align:left;"> 8/16/2014 </td> <td style="text-align:right;"> 59 </td> @@ -755,7 +748,7 @@ <tr> <td style="text-align:left;"> 544bd1 </td> <td style="text-align:right;"> 10 </td> - <td style="text-align:left;"> f </td> + <td style="text-align:left;"> m </td> <td style="text-align:left;"> TRUE </td> <td style="text-align:left;"> 8/29/2014 </td> <td style="text-align:right;"> 39 </td> @@ -763,19 +756,11 @@ <tr> <td style="text-align:left;"> 544bd1 </td> <td style="text-align:right;"> 10 </td> - <td style="text-align:left;"> f </td> + <td style="text-align:left;"> m </td> <td style="text-align:left;"> TRUE </td> <td style="text-align:left;"> 8/29/2014 </td> <td style="text-align:right;"> 39 </td> </tr> - <tr> - <td style="text-align:left;"> 544bd1 </td> - <td style="text-align:right;"> 10 </td> - <td style="text-align:left;"> f </td> - <td style="text-align:left;"> FALSE </td> - <td style="text-align:left;"> 8/29/2014 </td> - <td style="text-align:right;"> 39 </td> - </tr> </tbody> </table> @@ -785,7 +770,7 @@ class: medium-large-table2 -# `select()` columnas +# Seleccionar columnas: `select()` .pull-left[ @@ -794,7 +779,7 @@ select(surv_raw, ___) ``` -`select()` también espera un marco de datos como primer argumento +`select()` también espera una base de datos como primer argumento ] @@ -803,19 +788,19 @@ <table> <thead> <tr> - <th style="text-align:left;"> case_id </th> - <th style="text-align:right;"> age </th> - <th style="text-align:left;"> sex </th> - <th style="text-align:left;"> lab_confirmed </th> - <th style="text-align:left;"> onset date </th> - <th style="text-align:right;"> wt (kg) </th> + <th style="text-align:left;"> id_caso </th> + <th style="text-align:right;"> edad </th> + <th style="text-align:left;"> sexo </th> + <th style="text-align:left;"> confirm_lab </th> + <th style="text-align:left;"> inicio fecha </th> + <th style="text-align:right;"> peso (kg) </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> 694928 </td> <td style="text-align:right;"> 23 </td> - <td style="text-align:left;"> m </td> + <td style="text-align:left;"> h </td> <td style="text-align:left;"> FALSE </td> <td style="text-align:left;"> 11/9/2014 </td> <td style="text-align:right;"> 70 </td> @@ -823,7 +808,7 @@ <tr> <td style="text-align:left;"> 86340d </td> <td style="text-align:right;"> 0 </td> - <td style="text-align:left;"> f </td> + <td style="text-align:left;"> m </td> <td style="text-align:left;"> TRUE </td> <td style="text-align:left;"> 10/30/2014 </td> <td style="text-align:right;"> 18 </td> @@ -831,7 +816,7 @@ <tr> <td style="text-align:left;"> 92d002 </td> <td style="text-align:right;"> 16 </td> - <td style="text-align:left;"> m </td> + <td style="text-align:left;"> h </td> <td style="text-align:left;"> TRUE </td> <td style="text-align:left;"> 8/16/2014 </td> <td style="text-align:right;"> 59 </td> @@ -839,7 +824,7 @@ <tr> <td style="text-align:left;"> 544bd1 </td> <td style="text-align:right;"> 10 </td> - <td style="text-align:left;"> f </td> + <td style="text-align:left;"> m </td> <td style="text-align:left;"> TRUE </td> <td style="text-align:left;"> 8/29/2014 </td> <td style="text-align:right;"> 39 </td> @@ -847,7 +832,7 @@ <tr> <td style="text-align:left;"> 544bd1 </td> <td style="text-align:right;"> 10 </td> - <td style="text-align:left;"> f </td> + <td style="text-align:left;"> m </td> <td style="text-align:left;"> TRUE </td> <td style="text-align:left;"> 8/29/2014 </td> <td style="text-align:right;"> 39 </td> @@ -855,7 +840,7 @@ <tr> <td style="text-align:left;"> 544bd1 </td> <td style="text-align:right;"> 10 </td> - <td style="text-align:left;"> f </td> + <td style="text-align:left;"> m </td> <td style="text-align:left;"> FALSE </td> <td style="text-align:left;"> 8/29/2014 </td> <td style="text-align:right;"> 39 </td> @@ -869,16 +854,16 @@ class: medium-large-table2 -# `select()` columnas +# Seleccionar columnas: `select()` .pull-left[ ```r -select(surv_raw, case_id, age) +select(surv_raw, id_caso, edad) ``` -Puedes proporcionar `select()` con nombres de columnas a *mantener* +Puedes proporcionar a `select()` los nombres de columnas a *mantener* ] @@ -887,8 +872,8 @@ <table> <thead> <tr> - <th style="text-align:left;"> case_id </th> - <th style="text-align:right;"> age </th> + <th style="text-align:left;"> id_caso </th> + <th style="text-align:right;"> edad </th> </tr> </thead> <tbody> @@ -925,16 +910,16 @@ class: medium-large-table2 -# `select()` columnas +# Seleccionar columnas: `select()` .pull-left[ ```r -select(surv_raw, case_id, age, sex) +select(surv_raw, id_caso, edad, sexo) ``` -Puedes proporcionar `select()` con nombres de columnas a *mantener* +Puedes proporcionar a `select()` los nombres de columnas a *mantener* ] @@ -943,41 +928,41 @@ <table> <thead> <tr> - <th style="text-align:left;"> case_id </th> - <th style="text-align:right;"> age </th> - <th style="text-align:left;"> sex </th> + <th style="text-align:left;"> id_caso </th> + <th style="text-align:right;"> edad </th> + <th style="text-align:left;"> sexo </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> 694928 </td> <td style="text-align:right;"> 23 </td> - <td style="text-align:left;"> m </td> + <td style="text-align:left;"> h </td> </tr> <tr> <td style="text-align:left;"> 86340d </td> <td style="text-align:right;"> 0 </td> - <td style="text-align:left;"> f </td> + <td style="text-align:left;"> m </td> </tr> <tr> <td style="text-align:left;"> 92d002 </td> <td style="text-align:right;"> 16 </td> - <td style="text-align:left;"> m </td> + <td style="text-align:left;"> h </td> </tr> <tr> <td style="text-align:left;"> 544bd1 </td> <td style="text-align:right;"> 10 </td> - <td style="text-align:left;"> f </td> + <td style="text-align:left;"> m </td> </tr> <tr> <td style="text-align:left;"> 544bd1 </td> <td style="text-align:right;"> 10 </td> - <td style="text-align:left;"> f </td> + <td style="text-align:left;"> m </td> </tr> <tr> <td style="text-align:left;"> 544bd1 </td> <td style="text-align:right;"> 10 </td> - <td style="text-align:left;"> f </td> + <td style="text-align:left;"> m </td> </tr> </tbody> </table> @@ -988,13 +973,13 @@ class: medium-large-table2 -# `select()` columnas +# Seleccionar columnas: `select()` .pull-left[ ```r -select(surv_raw, -case_id, -lab_confirmed) +select(surv_raw, -id_caso, -confirm_lab) ``` O puedes designar qué columnas *eliminar* con -. @@ -1006,46 +991,46 @@ <table> <thead> <tr> - <th style="text-align:right;"> age </th> - <th style="text-align:left;"> sex </th> - <th style="text-align:left;"> onset date </th> - <th style="text-align:right;"> wt (kg) </th> + <th style="text-align:right;"> edad </th> + <th style="text-align:left;"> sexo </th> + <th style="text-align:left;"> inicio fecha </th> + <th style="text-align:right;"> peso (kg) </th> </tr> </thead> <tbody> <tr> <td style="text-align:right;"> 23 </td> - <td style="text-align:left;"> m </td> + <td style="text-align:left;"> h </td> <td style="text-align:left;"> 11/9/2014 </td> <td style="text-align:right;"> 70 </td> </tr> <tr> <td style="text-align:right;"> 0 </td> - <td style="text-align:left;"> f </td> + <td style="text-align:left;"> m </td> <td style="text-align:left;"> 10/30/2014 </td> <td style="text-align:right;"> 18 </td> </tr> <tr> <td style="text-align:right;"> 16 </td> - <td style="text-align:left;"> m </td> + <td style="text-align:left;"> h </td> <td style="text-align:left;"> 8/16/2014 </td> <td style="text-align:right;"> 59 </td> </tr> <tr> <td style="text-align:right;"> 10 </td> - <td style="text-align:left;"> f </td> + <td style="text-align:left;"> m </td> <td style="text-align:left;"> 8/29/2014 </td> <td style="text-align:right;"> 39 </td> </tr> <tr> <td style="text-align:right;"> 10 </td> - <td style="text-align:left;"> f </td> + <td style="text-align:left;"> m </td> <td style="text-align:left;"> 8/29/2014 </td> <td style="text-align:right;"> 39 </td> </tr> <tr> <td style="text-align:right;"> 10 </td> - <td style="text-align:left;"> f </td> + <td style="text-align:left;"> m </td> <td style="text-align:left;"> 8/29/2014 </td> <td style="text-align:right;"> 39 </td> </tr> @@ -1056,20 +1041,20 @@ --- -# `filter()` *y* `select()`? +# ¿`filter()` *y* `select()`? -¡Sí! Utiliza el **%>%** "para "pasar" datos de una función a otra. +¡Sí! Utiliza el **%>%** para "pasar" datos de una función a otra. -.tirar-izquierda\[ +.pull-left[ Es como decir las palabras **"y entonces"**. -Una orden de limpieza típica contiene un *secuencia* de pasos enlazados +Una *secuencia* de limpieza típica contiene una serie de pasos enlazados - Cambiar el nombre de las columnas - Filtrar filas - Seleccionar columnas -- Deduplicar +- Desduplicar - Limpiar valores... ] @@ -1084,39 +1069,39 @@ class: medium-large-table2 -# Datos de la tubería +# Datos en la "tubería" (secuencia) -Anteriormente, el 1er argumento era el marco de datos +Anteriormente, el 1er argumento era la base de datos -`filter(`**sobrevivir\_sin procesar**`, age < 18)` +`filter(`**surv\_raw**`, edad < 18)` -- Usando tuberías, esto se escribe ahora como -**surv\_raw** `%>% filter(age < 18)` +**surv\_raw** `%>% filter(edad < 18)` -- -Puedes canalizar los datos a través de *múltiples* funciones +Puedes conectar los datos a través de *múltiples* funciones `surv_raw` <table> <thead> <tr> - <th style="text-align:left;"> case_id </th> - <th style="text-align:right;"> age </th> - <th style="text-align:left;"> sex </th> - <th style="text-align:left;"> lab_confirmed </th> - <th style="text-align:left;"> onset date </th> - <th style="text-align:right;"> wt (kg) </th> + <th style="text-align:left;"> id_caso </th> + <th style="text-align:right;"> edad </th> + <th style="text-align:left;"> sexo </th> + <th style="text-align:left;"> confirm_lab </th> + <th style="text-align:left;"> inicio fecha </th> + <th style="text-align:right;"> peso (kg) </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> 694928 </td> <td style="text-align:right;"> 23 </td> - <td style="text-align:left;"> m </td> + <td style="text-align:left;"> h </td> <td style="text-align:left;"> FALSE </td> <td style="text-align:left;"> 11/9/2014 </td> <td style="text-align:right;"> 70 </td> @@ -1124,7 +1109,7 @@ <tr> <td style="text-align:left;"> 86340d </td> <td style="text-align:right;"> 0 </td> - <td style="text-align:left;"> f </td> + <td style="text-align:left;"> m </td> <td style="text-align:left;"> TRUE </td> <td style="text-align:left;"> 10/30/2014 </td> <td style="text-align:right;"> 18 </td> @@ -1132,7 +1117,7 @@ <tr> <td style="text-align:left;"> 92d002 </td> <td style="text-align:right;"> 16 </td> - <td style="text-align:left;"> m </td> + <td style="text-align:left;"> h </td> <td style="text-align:left;"> TRUE </td> <td style="text-align:left;"> 8/16/2014 </td> <td style="text-align:right;"> 59 </td> @@ -1140,7 +1125,7 @@ <tr> <td style="text-align:left;"> 544bd1 </td> <td style="text-align:right;"> 10 </td> - <td style="text-align:left;"> f </td> + <td style="text-align:left;"> m </td> <td style="text-align:left;"> TRUE </td> <td style="text-align:left;"> 8/29/2014 </td> <td style="text-align:right;"> 39 </td> @@ -1148,7 +1133,7 @@ <tr> <td style="text-align:left;"> 544bd1 </td> <td style="text-align:right;"> 10 </td> - <td style="text-align:left;"> f </td> + <td style="text-align:left;"> m </td> <td style="text-align:left;"> TRUE </td> <td style="text-align:left;"> 8/29/2014 </td> <td style="text-align:right;"> 39 </td> @@ -1156,7 +1141,7 @@ <tr> <td style="text-align:left;"> 544bd1 </td> <td style="text-align:right;"> 10 </td> - <td style="text-align:left;"> f </td> + <td style="text-align:left;"> m </td> <td style="text-align:left;"> FALSE </td> <td style="text-align:left;"> 8/29/2014 </td> <td style="text-align:right;"> 39 </td> @@ -1168,35 +1153,35 @@ class: medium-large-table2 -# Datos de tuberías +# Datos en la "tubería" (secuencia) -Anteriormente, el 1er argumento era el marco de datos +Anteriormente, el 1er argumento era la base de datos -`filter(`**sobrevivir\_sin procesar**`, age < 18)` +`filter(`**surv\_raw**`, edad < 18)` Usando tuberías, esto se escribe ahora como -**surv\_raw** `%>% filter(age < 18)` +**surv\_raw** `%>% filter(edad < 18)` -Puedes canalizar los datos a través de *múltiples* funciones -`surv_raw` **%>%** `filter(age < 18)` +Puedes conectar los datos de `surv_raw` a través de *múltiples* funciones +`surv_raw` **%>%** `filter(edad < 18)` <table> <thead> <tr> - <th style="text-align:left;"> case_id </th> - <th style="text-align:right;"> age </th> - <th style="text-align:left;"> sex </th> - <th style="text-align:left;"> lab_confirmed </th> - <th style="text-align:left;"> onset date </th> - <th style="text-align:right;"> wt (kg) </th> + <th style="text-align:left;"> id_caso </th> + <th style="text-align:right;"> edad </th> + <th style="text-align:left;"> sexo </th> + <th style="text-align:left;"> confirm_lab </th> + <th style="text-align:left;"> inicio fecha </th> + <th style="text-align:right;"> peso (kg) </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> 86340d </td> <td style="text-align:right;"> 0 </td> - <td style="text-align:left;"> f </td> + <td style="text-align:left;"> m </td> <td style="text-align:left;"> TRUE </td> <td style="text-align:left;"> 10/30/2014 </td> <td style="text-align:right;"> 18 </td> @@ -1204,7 +1189,7 @@ <tr> <td style="text-align:left;"> 92d002 </td> <td style="text-align:right;"> 16 </td> - <td style="text-align:left;"> m </td> + <td style="text-align:left;"> h </td> <td style="text-align:left;"> TRUE </td> <td style="text-align:left;"> 8/16/2014 </td> <td style="text-align:right;"> 59 </td> @@ -1212,7 +1197,7 @@ <tr> <td style="text-align:left;"> 544bd1 </td> <td style="text-align:right;"> 10 </td> - <td style="text-align:left;"> f </td> + <td style="text-align:left;"> m </td> <td style="text-align:left;"> TRUE </td> <td style="text-align:left;"> 8/29/2014 </td> <td style="text-align:right;"> 39 </td> @@ -1220,7 +1205,7 @@ <tr> <td style="text-align:left;"> 544bd1 </td> <td style="text-align:right;"> 10 </td> - <td style="text-align:left;"> f </td> + <td style="text-align:left;"> m </td> <td style="text-align:left;"> TRUE </td> <td style="text-align:left;"> 8/29/2014 </td> <td style="text-align:right;"> 39 </td> @@ -1228,7 +1213,7 @@ <tr> <td style="text-align:left;"> 544bd1 </td> <td style="text-align:right;"> 10 </td> - <td style="text-align:left;"> f </td> + <td style="text-align:left;"> m </td> <td style="text-align:left;"> FALSE </td> <td style="text-align:left;"> 8/29/2014 </td> <td style="text-align:right;"> 39 </td> @@ -1240,52 +1225,52 @@ class: medium-large-table2 -# Datos de la tubería +# Datos en la "tubería" (secuencia) -Anteriormente, el 1er argumento era el marco de datos +Anteriormente, el 1er argumento era la base de datos -`filter(`**sobrevivir\_sin procesar**`, age < 18)` +`filter(`**surv\_raw**`, edad < 18)` Usando tuberías, esto se escribe ahora como -**surv\_raw** `%>% filter(age < 18)` +**surv\_raw** `%>% filter(edad < 18)` -Puedes canalizar los datos a través de *múltiples* funciones -`surv_raw` **%>%** `filter(age < 18)` **%>%** `select(case_id, age, sex)` +Puedes conectar los datos de `surv_raw` a través de *múltiples* funciones +`surv_raw` **%>%** `filter(edad < 18)` **%>%** `select(id_caso, edad, sexo)` <table> <thead> <tr> - <th style="text-align:left;"> case_id </th> - <th style="text-align:right;"> age </th> - <th style="text-align:left;"> sex </th> + <th style="text-align:left;"> id_caso </th> + <th style="text-align:right;"> edad </th> + <th style="text-align:left;"> sexo </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> 86340d </td> <td style="text-align:right;"> 0 </td> - <td style="text-align:left;"> f </td> + <td style="text-align:left;"> m </td> </tr> <tr> <td style="text-align:left;"> 92d002 </td> <td style="text-align:right;"> 16 </td> - <td style="text-align:left;"> m </td> + <td style="text-align:left;"> h </td> </tr> <tr> <td style="text-align:left;"> 544bd1 </td> <td style="text-align:right;"> 10 </td> - <td style="text-align:left;"> f </td> + <td style="text-align:left;"> m </td> </tr> <tr> <td style="text-align:left;"> 544bd1 </td> <td style="text-align:right;"> 10 </td> - <td style="text-align:left;"> f </td> + <td style="text-align:left;"> m </td> </tr> <tr> <td style="text-align:left;"> 544bd1 </td> <td style="text-align:right;"> 10 </td> - <td style="text-align:left;"> f </td> + <td style="text-align:left;"> m </td> </tr> </tbody> </table> @@ -1294,7 +1279,7 @@ # Estilo de codificación vertical -A *vertical* con sangrías no afecta al código, ¡pero lo hace más legible! +Un estilo de codificación *vertical* con *sangrías* no afecta al código, ¡pero lo hace más legible! ```r @@ -1304,19 +1289,19 @@ <table> <thead> <tr> - <th style="text-align:left;"> case_id </th> - <th style="text-align:right;"> age </th> - <th style="text-align:left;"> sex </th> - <th style="text-align:left;"> lab_confirmed </th> - <th style="text-align:left;"> onset date </th> - <th style="text-align:right;"> wt (kg) </th> + <th style="text-align:left;"> id_caso </th> + <th style="text-align:right;"> edad </th> + <th style="text-align:left;"> sexo </th> + <th style="text-align:left;"> confirm_lab </th> + <th style="text-align:left;"> inicio fecha </th> + <th style="text-align:right;"> peso (kg) </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> 694928 </td> <td style="text-align:right;"> 23 </td> - <td style="text-align:left;"> m </td> + <td style="text-align:left;"> h </td> <td style="text-align:left;"> FALSE </td> <td style="text-align:left;"> 11/9/2014 </td> <td style="text-align:right;"> 70 </td> @@ -1324,7 +1309,7 @@ <tr> <td style="text-align:left;"> 86340d </td> <td style="text-align:right;"> 0 </td> - <td style="text-align:left;"> f </td> + <td style="text-align:left;"> m </td> <td style="text-align:left;"> TRUE </td> <td style="text-align:left;"> 10/30/2014 </td> <td style="text-align:right;"> 18 </td> @@ -1332,7 +1317,7 @@ <tr> <td style="text-align:left;"> 92d002 </td> <td style="text-align:right;"> 16 </td> - <td style="text-align:left;"> m </td> + <td style="text-align:left;"> h </td> <td style="text-align:left;"> TRUE </td> <td style="text-align:left;"> 8/16/2014 </td> <td style="text-align:right;"> 59 </td> @@ -1340,7 +1325,7 @@ <tr> <td style="text-align:left;"> 544bd1 </td> <td style="text-align:right;"> 10 </td> - <td style="text-align:left;"> f </td> + <td style="text-align:left;"> m </td> <td style="text-align:left;"> TRUE </td> <td style="text-align:left;"> 8/29/2014 </td> <td style="text-align:right;"> 39 </td> @@ -1348,7 +1333,7 @@ <tr> <td style="text-align:left;"> 544bd1 </td> <td style="text-align:right;"> 10 </td> - <td style="text-align:left;"> f </td> + <td style="text-align:left;"> m </td> <td style="text-align:left;"> TRUE </td> <td style="text-align:left;"> 8/29/2014 </td> <td style="text-align:right;"> 39 </td> @@ -1356,7 +1341,7 @@ <tr> <td style="text-align:left;"> 544bd1 </td> <td style="text-align:right;"> 10 </td> - <td style="text-align:left;"> f </td> + <td style="text-align:left;"> m </td> <td style="text-align:left;"> FALSE </td> <td style="text-align:left;"> 8/29/2014 </td> <td style="text-align:right;"> 39 </td> @@ -1368,7 +1353,7 @@ # Estilo de codificación vertical -A *vertical* con sangrías no afecta al código, ¡pero lo hace más legible! +Un estilo de codificación *vertical* con *sangrías* no afecta al código, ¡pero lo hace más legible! @@ -1379,7 +1364,7 @@ ```r surv_raw %>% - select(case_id, age, sex, lab_confirmed) # seleccionar columnas + select(id_caso, edad, sexo, confirm_lab) # seleccionar columnas ``` @@ -1391,47 +1376,47 @@ <table> <thead> <tr> - <th style="text-align:left;"> case_id </th> - <th style="text-align:right;"> age </th> - <th style="text-align:left;"> sex </th> - <th style="text-align:left;"> lab_confirmed </th> + <th style="text-align:left;"> id_caso </th> + <th style="text-align:right;"> edad </th> + <th style="text-align:left;"> sexo </th> + <th style="text-align:left;"> confirm_lab </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> 694928 </td> <td style="text-align:right;"> 23 </td> - <td style="text-align:left;"> m </td> + <td style="text-align:left;"> h </td> <td style="text-align:left;"> FALSE </td> </tr> <tr> <td style="text-align:left;"> 86340d </td> <td style="text-align:right;"> 0 </td> - <td style="text-align:left;"> f </td> + <td style="text-align:left;"> m </td> <td style="text-align:left;"> TRUE </td> </tr> <tr> <td style="text-align:left;"> 92d002 </td> <td style="text-align:right;"> 16 </td> - <td style="text-align:left;"> m </td> + <td style="text-align:left;"> h </td> <td style="text-align:left;"> TRUE </td> </tr> <tr> <td style="text-align:left;"> 544bd1 </td> <td style="text-align:right;"> 10 </td> - <td style="text-align:left;"> f </td> + <td style="text-align:left;"> m </td> <td style="text-align:left;"> TRUE </td> </tr> <tr> <td style="text-align:left;"> 544bd1 </td> <td style="text-align:right;"> 10 </td> - <td style="text-align:left;"> f </td> + <td style="text-align:left;"> m </td> <td style="text-align:left;"> TRUE </td> </tr> <tr> <td style="text-align:left;"> 544bd1 </td> <td style="text-align:right;"> 10 </td> - <td style="text-align:left;"> f </td> + <td style="text-align:left;"> m </td> <td style="text-align:left;"> FALSE </td> </tr> </tbody> @@ -1441,7 +1426,7 @@ # Estilo de codificación vertical -En **`%>%`** pasa el conjunto de datos al siguiente paso +El **`%>%`** pasa el conjunto de datos al siguiente paso @@ -1452,48 +1437,48 @@ ```r surv_raw %>% - select(case_id, age, sex, lab_confirmed) %>% # seleccionar columnas - distinct() # de-duplicar + select(id_caso, edad, sexo, confirm_lab) %>% # seleccionar columnas + distinct() # des-duplicar ``` <table> <thead> <tr> - <th style="text-align:left;"> case_id </th> - <th style="text-align:right;"> age </th> - <th style="text-align:left;"> sex </th> - <th style="text-align:left;"> lab_confirmed </th> + <th style="text-align:left;"> id_caso </th> + <th style="text-align:right;"> edad </th> + <th style="text-align:left;"> sexo </th> + <th style="text-align:left;"> confirm_lab </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> 694928 </td> <td style="text-align:right;"> 23 </td> - <td style="text-align:left;"> m </td> + <td style="text-align:left;"> h </td> <td style="text-align:left;"> FALSE </td> </tr> <tr> <td style="text-align:left;"> 86340d </td> <td style="text-align:right;"> 0 </td> - <td style="text-align:left;"> f </td> + <td style="text-align:left;"> m </td> <td style="text-align:left;"> TRUE </td> </tr> <tr> <td style="text-align:left;"> 92d002 </td> <td style="text-align:right;"> 16 </td> - <td style="text-align:left;"> m </td> + <td style="text-align:left;"> h </td> <td style="text-align:left;"> TRUE </td> </tr> <tr> <td style="text-align:left;"> 544bd1 </td> <td style="text-align:right;"> 10 </td> - <td style="text-align:left;"> f </td> + <td style="text-align:left;"> m </td> <td style="text-align:left;"> TRUE </td> </tr> <tr> <td style="text-align:left;"> 544bd1 </td> <td style="text-align:right;"> 10 </td> - <td style="text-align:left;"> f </td> + <td style="text-align:left;"> m </td> <td style="text-align:left;"> FALSE </td> </tr> </tbody> @@ -1503,7 +1488,7 @@ # Estilo de codificación vertical -En **`%>%`** pasa el conjunto de datos al siguiente paso +El **`%>%`** pasa la base de datos al siguiente paso @@ -1514,37 +1499,37 @@ ```r surv_raw %>% - select(case_id, age, sex, lab_confirmed) %>% # seleccionar columnas - distinct() %>% # de-duplicar - filter(age < 18, lab_confirmed == TRUE) # sólo los casos confirmados de niños pequeños + select(id_caso, edad, sexo, confirm_lab) %>% # seleccionar columnas + distinct() %>% # des-duplicar + filter(edad < 18, confirm_lab == TRUE) # sólo los casos confirmados de niños pequeños ``` <table> <thead> <tr> - <th style="text-align:left;"> case_id </th> - <th style="text-align:right;"> age </th> - <th style="text-align:left;"> sex </th> - <th style="text-align:left;"> lab_confirmed </th> + <th style="text-align:left;"> id_caso </th> + <th style="text-align:right;"> edad </th> + <th style="text-align:left;"> sexo </th> + <th style="text-align:left;"> confirm_lab </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> 86340d </td> <td style="text-align:right;"> 0 </td> - <td style="text-align:left;"> f </td> + <td style="text-align:left;"> m </td> <td style="text-align:left;"> TRUE </td> </tr> <tr> <td style="text-align:left;"> 92d002 </td> <td style="text-align:right;"> 16 </td> - <td style="text-align:left;"> m </td> + <td style="text-align:left;"> h </td> <td style="text-align:left;"> TRUE </td> </tr> <tr> <td style="text-align:left;"> 544bd1 </td> <td style="text-align:right;"> 10 </td> - <td style="text-align:left;"> f </td> + <td style="text-align:left;"> m </td> <td style="text-align:left;"> TRUE </td> </tr> </tbody> @@ -1554,7 +1539,7 @@ # Estilo de codificación vertical -En **`%>%`** pasa el conjunto de datos al siguiente paso +El **`%>%`** pasa la base de datos al siguiente paso @@ -1565,19 +1550,19 @@ ```r surv_raw %>% - select(case_id, age, sex, lab_confirmed) %>% # seleccionar columnas - distinct() %>% # de-duplicar - filter(age < 18, lab_confirmed == TRUE) %>% # casos confirmados sólo en niños pequeños - mutate(infant = ifelse(age < 1, "infant", "not infant")) # crear una columna + select(id_caso, edad, sexo, confirm_lab) %>% # seleccionar columnas + distinct() %>% # des-duplicar + filter(edad < 18, confirm_lab == TRUE) %>% # casos confirmados sólo en niños pequeños + mutate(infant = ifelse(edad < 1, "infant", "not infant")) # crear una columna ``` <table> <thead> <tr> - <th style="text-align:left;"> case_id </th> - <th style="text-align:right;"> age </th> - <th style="text-align:left;"> sex </th> - <th style="text-align:left;"> lab_confirmed </th> + <th style="text-align:left;"> id_caso </th> + <th style="text-align:right;"> edad </th> + <th style="text-align:left;"> sexo </th> + <th style="text-align:left;"> confirm_lab </th> <th style="text-align:left;"> infant </th> </tr> </thead> @@ -1585,21 +1570,21 @@ <tr> <td style="text-align:left;"> 86340d </td> <td style="text-align:right;"> 0 </td> - <td style="text-align:left;"> f </td> + <td style="text-align:left;"> m </td> <td style="text-align:left;"> TRUE </td> <td style="text-align:left;"> infant </td> </tr> <tr> <td style="text-align:left;"> 92d002 </td> <td style="text-align:right;"> 16 </td> - <td style="text-align:left;"> m </td> + <td style="text-align:left;"> h </td> <td style="text-align:left;"> TRUE </td> <td style="text-align:left;"> not infant </td> </tr> <tr> <td style="text-align:left;"> 544bd1 </td> <td style="text-align:right;"> 10 </td> - <td style="text-align:left;"> f </td> + <td style="text-align:left;"> m </td> <td style="text-align:left;"> TRUE </td> <td style="text-align:left;"> not infant </td> </tr> @@ -1610,7 +1595,7 @@ # Estilo de codificación vertical -¿Hay un operador de tubería al final de este flujo de trabajo? +¿Hay un operador 'pipe' al final de este flujo de trabajo? @@ -1621,19 +1606,19 @@ ```r surv_raw %>% - select(case_id, age, sex, lab_confirmed) %>% # seleccionar columnas - distinct() %>% # de-duplicar - filter(age < 18, lab_confirmed == TRUE) %>% # casos confirmados sólo en niños pequeños - mutate(infant = ifelse(age < 1, "infant", "not infant")) # crear una columna + select(id_caso, edad, sexo, confirm_lab) %>% # seleccionar columnas + distinct() %>% # des-duplicar + filter(edad < 18, confirm_lab == TRUE) %>% # casos confirmados sólo en niños pequeños + mutate(infant = ifelse(edad < 1, "infant", "not infant")) # crear una columna ``` <table> <thead> <tr> - <th style="text-align:left;"> case_id </th> - <th style="text-align:right;"> age </th> - <th style="text-align:left;"> sex </th> - <th style="text-align:left;"> lab_confirmed </th> + <th style="text-align:left;"> id_caso </th> + <th style="text-align:right;"> edad </th> + <th style="text-align:left;"> sexo </th> + <th style="text-align:left;"> confirm_lab </th> <th style="text-align:left;"> infant </th> </tr> </thead> @@ -1641,21 +1626,21 @@ <tr> <td style="text-align:left;"> 86340d </td> <td style="text-align:right;"> 0 </td> - <td style="text-align:left;"> f </td> + <td style="text-align:left;"> m </td> <td style="text-align:left;"> TRUE </td> <td style="text-align:left;"> infant </td> </tr> <tr> <td style="text-align:left;"> 92d002 </td> <td style="text-align:right;"> 16 </td> - <td style="text-align:left;"> m </td> + <td style="text-align:left;"> h </td> <td style="text-align:left;"> TRUE </td> <td style="text-align:left;"> not infant </td> </tr> <tr> <td style="text-align:left;"> 544bd1 </td> <td style="text-align:right;"> 10 </td> - <td style="text-align:left;"> f </td> + <td style="text-align:left;"> m </td> <td style="text-align:left;"> TRUE </td> <td style="text-align:left;"> not infant </td> </tr> @@ -1669,81 +1654,91 @@ --- -# Limpia los nombres de las columnas +# Nombres de las columnas Podemos observar los cambios en los nombres de las columnas imprimiéndolos con `names()` ```r -# print current column names +# Imprimir los nombres de las columnas actuales names(surv_raw) ``` ``` -## [1] "case_id" "age" "sex" "lab_confirmed" -## [5] "onset date" "wt (kg)" +## [1] "id_caso" "edad" "sexo" "confirm_lab" "inicio fecha" +## [6] "peso (kg)" ``` --- -# Limpia los nombres de las columnas +# Nombres de las columnas -De forma equivalente, `surv_raw` puede pasarse a `names()` utilizando un **tubería**: +De forma equivalente, `surv_raw` puede pasarse a `names()` utilizando un **pipe**: ```r -surv_raw %>% # begin with raw data - names() # print current column names +surv_raw %>% # comienza con los datos crudos + names() # imprime los nombres actuales de las columnas ``` ``` -## [1] "case_id" "age" "sex" "lab_confirmed" -## [5] "onset date" "wt (kg)" +## [1] "id_caso" "edad" "sexo" "confirm_lab" "inicio fecha" +## [6] "peso (kg)" ``` -- -Aplica `clean_names()` a `surv_raw` insertándolo en la secuencia de tuberías. -Así se normalizan los nombres de las columnas (en minúsculas, sin espacios ni caracteres especiales). +Aplica `clean_names()` a `surv_raw` agregándolo en la secuencia. +Así se estandarizan los nombres de las columnas: +en minúsculas, sin espacios ni caracteres especiales. ```r -surv_raw %>% # begin with raw data -* clean_names() %>% # standardize column names - names() # print current column names +surv_raw %>% # comienza con los datos crudos +* clean_names() %>% # estandariza los nombres de las columnas + names() # imprime los nombres actuales de las columnas ``` ``` -## [1] "case_id" "age" "sex" "lab_confirmed" -## [5] "onset_date" "wt_kg" +## [1] "id_caso" "edad" "sexo" "confirm_lab" "inicio_fecha" +## [6] "peso_kg" ``` *Ver cambios en las dos últimas columnas* --- -# Limpia los nombres de las columnas +# Nombres de las columnas -De forma equivalente, `surv_raw` puede pasarse a `names()` utilizando un **tubería**: +De forma equivalente, `surv_raw` puede pasarse a `names()` utilizando un **pipe**: ```r -surv_raw %>% # begin with raw data - names() # print current column names +surv_raw %>% # comienza con los datos crudos + names() # imprime los nombres actuales de las columnas ``` ``` -## [1] "case_id" "age" "sex" "lab_confirmed" -## [5] "onset date" "wt (kg)" +## [1] "id_caso" "edad" "sexo" "confirm_lab" "inicio fecha" +## [6] "peso (kg)" ``` -A continuación, canaliza el **limpio** a `rename()` para editarlos manualmente. -Ten en cuenta que `rename()` hace referencia a **limpiado** limpios (`onset_date`). +Ahora, incorpora los nombres **limpios** a `rename()` para editarlos manualmente. +Ten en cuenta que `rename()` conecta a los nombres **limpios** (`inicio_fecha`). +```r +surv_raw %>% # comienza con los datos crudos +* clean_names() %>% # estandariza los nombres de las columnas +* rename( # edita manualmente +* edad_anios = edad, # NUEVO = VIEJO +* fecha_inicio = inicio_fecha) %>% + names() # imprime los nombres actuales de las columnas +``` + --- # Imprimir vs. guardar @@ -1753,36 +1748,61 @@ .panelset[ .panel[.panel-name[Printing] -Los cambios anteriores a `surv_raw` eran **no** salvados. +Los cambios en `surv_raw` **no** fueron guardados. -Sólo *imprimimos con modificaciones*. +Sólo *imprimimos las modificaciones*. +```r +# modifica e imprime los nombres de las columnas +*surv_raw %>% # comienza con los datos crudos + clean_names() %>% # estandariza los nombres de las columnas + rename( # edita manualmente + edad_anios = edad, # NUEVO = VIEJO + fecha_inicio = inicio_fecha) %>% +* names() # imprime los nombres actuales de las columnas +``` -**`surv_raw`** todavía tiene el *nombres originales de las columnas* ¡! +¡**`surv_raw`** todavía tiene los *nombres originales de las columnas*! +```r +names(surv_raw) +``` + +``` +## [1] "id_caso" "edad" "sexo" "confirm_lab" "inicio fecha" +## [6] "peso (kg)" +``` .panel[.panel-name[Saving] -Utiliza la función **`<-`** para guardar los cambios en un nuevo **`surv_clean`** marco de datos. +Utiliza el operador **`<-`** para guardar los cambios en un nuevo objeto **`surv_clean`**. -No se imprime ninguna salida, pero el nuevo objeto aparecerá en el Entorno RStudio. +Aunque no se imprime nada, el nuevo objeto estará en el Entorno de RStudio. ```r -# create new data frame +# crea una nueva base de datos *surv_clean <- surv_raw %>% clean_names() %>% rename( - age_years = age, - date_onset = onset_date) + edad_anios = edad, + fecha_inicio = inicio_fecha) ``` -**`surv_clean`** tiene el *nombres de columna limpios* ¡! +¡**`surv_clean`** tiene ahora los *nombres de las columnas limpios*! +```r +names(surv_clean) +``` + +``` +## [1] "id_caso" "edad_anios" "sexo" "confirm_lab" "fecha_inicio" +## [6] "peso_kg" +``` ] ] @@ -1793,14 +1813,14 @@ class: medium-large-table2 -# `mutate()` a *crear* columnas +# Crear columnas: `mutate()` La sintaxis es ```r -DATASET %>% - mutate(NEW_COLUMN_NAME = A_FUNCTION(arguments)) +base_de_datos %>% + mutate(NUEVO_NOMBRE = UNA_FUNCIÓN(argumentos)) ``` .pull-left[ @@ -1808,16 +1828,16 @@ ```r surv_raw %>% - mutate(age_group = ifelse( - test = age >= 18, - yes = "adult", - no = "minor")) + mutate(grupo_etario = ifelse( + test = edad >= 18, + yes = "adulto", + no = "menor")) ``` -`ifelse()` comprueba lógicamente cada fila y escribe en la nueva `age_group` columna: +`ifelse()` comprueba lógicamente cada fila y escribe en la nueva columna `grupo_etario`: -- "adulto" si la prueba es VERDADERA -- "menor" si la prueba es FALSA +- "adulto" si es VERDADERO +- "menor" si es FALSA ] @@ -1826,69 +1846,69 @@ <table> <thead> <tr> - <th style="text-align:left;"> case_id </th> - <th style="text-align:right;"> age </th> - <th style="text-align:left;"> sex </th> - <th style="text-align:left;"> lab_confirmed </th> - <th style="text-align:left;"> onset date </th> - <th style="text-align:right;"> wt (kg) </th> - <th style="text-align:left;"> age_group </th> + <th style="text-align:left;"> id_caso </th> + <th style="text-align:right;"> edad </th> + <th style="text-align:left;"> sexo </th> + <th style="text-align:left;"> confirm_lab </th> + <th style="text-align:left;"> inicio fecha </th> + <th style="text-align:right;"> peso (kg) </th> + <th style="text-align:left;"> grupo_etario </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> 694928 </td> <td style="text-align:right;"> 23 </td> - <td style="text-align:left;"> m </td> + <td style="text-align:left;"> h </td> <td style="text-align:left;"> FALSE </td> <td style="text-align:left;"> 11/9/2014 </td> <td style="text-align:right;"> 70 </td> - <td style="text-align:left;"> adult </td> + <td style="text-align:left;"> adulto </td> </tr> <tr> <td style="text-align:left;"> 86340d </td> <td style="text-align:right;"> 0 </td> - <td style="text-align:left;"> f </td> + <td style="text-align:left;"> m </td> <td style="text-align:left;"> TRUE </td> <td style="text-align:left;"> 10/30/2014 </td> <td style="text-align:right;"> 18 </td> - <td style="text-align:left;"> minor </td> + <td style="text-align:left;"> menor </td> </tr> <tr> <td style="text-align:left;"> 92d002 </td> <td style="text-align:right;"> 16 </td> - <td style="text-align:left;"> m </td> + <td style="text-align:left;"> h </td> <td style="text-align:left;"> TRUE </td> <td style="text-align:left;"> 8/16/2014 </td> <td style="text-align:right;"> 59 </td> - <td style="text-align:left;"> minor </td> + <td style="text-align:left;"> menor </td> </tr> <tr> <td style="text-align:left;"> 544bd1 </td> <td style="text-align:right;"> 10 </td> - <td style="text-align:left;"> f </td> + <td style="text-align:left;"> m </td> <td style="text-align:left;"> TRUE </td> <td style="text-align:left;"> 8/29/2014 </td> <td style="text-align:right;"> 39 </td> - <td style="text-align:left;"> minor </td> + <td style="text-align:left;"> menor </td> </tr> <tr> <td style="text-align:left;"> 544bd1 </td> <td style="text-align:right;"> 10 </td> - <td style="text-align:left;"> f </td> + <td style="text-align:left;"> m </td> <td style="text-align:left;"> TRUE </td> <td style="text-align:left;"> 8/29/2014 </td> <td style="text-align:right;"> 39 </td> - <td style="text-align:left;"> minor </td> + <td style="text-align:left;"> menor </td> </tr> <tr> <td style="text-align:left;"> 544bd1 </td> <td style="text-align:right;"> 10 </td> - <td style="text-align:left;"> f </td> + <td style="text-align:left;"> m </td> <td style="text-align:left;"> FALSE </td> <td style="text-align:left;"> 8/29/2014 </td> <td style="text-align:right;"> 39 </td> - <td style="text-align:left;"> minor </td> + <td style="text-align:left;"> menor </td> </tr> </tbody> </table> @@ -1899,14 +1919,14 @@ class: medium-large-table2 -# `mutate()` a *editar* columnas +# Editar columnas con `mutate()` La sintaxis es similar: ```r -DATASET %>% - mutate(SAME_COLUMN_NAME = A_FUNCTION(arguments)) +base_de_datos %>% + mutate(MISMO_NOMBRE_DE_COLUMNA = UNA_FUNCIÓN(argumentos)) ``` .pull-left[ @@ -1914,17 +1934,17 @@ ```r surv_raw %>% - mutate(sex = recode(sex, - "m" = "male", - "f" = "female")) + mutate(sexo = recode(sexo, + "h" = "hombre", + "m" = "mujer")) ``` -Columna `sex` se sobrescribe. +La columna `sexo` se sobrescribe. -`recode()` comienza con el original `sex` y aplica los cambios: +La función `recode()` comienza con el original de `sexo` y aplica los cambios: -- "m" a "hombre" -- "f" a "mujer" +- "h" a "hombre" +- "m" a "mujer" ] @@ -1933,19 +1953,19 @@ <table> <thead> <tr> - <th style="text-align:left;"> case_id </th> - <th style="text-align:right;"> age </th> - <th style="text-align:left;"> sex </th> - <th style="text-align:left;"> lab_confirmed </th> - <th style="text-align:left;"> onset date </th> - <th style="text-align:right;"> wt (kg) </th> + <th style="text-align:left;"> id_caso </th> + <th style="text-align:right;"> edad </th> + <th style="text-align:left;"> sexo </th> + <th style="text-align:left;"> confirm_lab </th> + <th style="text-align:left;"> inicio fecha </th> + <th style="text-align:right;"> peso (kg) </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> 694928 </td> <td style="text-align:right;"> 23 </td> - <td style="text-align:left;"> male </td> + <td style="text-align:left;"> hombre </td> <td style="text-align:left;"> FALSE </td> <td style="text-align:left;"> 11/9/2014 </td> <td style="text-align:right;"> 70 </td> @@ -1953,7 +1973,7 @@ <tr> <td style="text-align:left;"> 86340d </td> <td style="text-align:right;"> 0 </td> - <td style="text-align:left;"> female </td> + <td style="text-align:left;"> mujer </td> <td style="text-align:left;"> TRUE </td> <td style="text-align:left;"> 10/30/2014 </td> <td style="text-align:right;"> 18 </td> @@ -1961,7 +1981,7 @@ <tr> <td style="text-align:left;"> 92d002 </td> <td style="text-align:right;"> 16 </td> - <td style="text-align:left;"> male </td> + <td style="text-align:left;"> hombre </td> <td style="text-align:left;"> TRUE </td> <td style="text-align:left;"> 8/16/2014 </td> <td style="text-align:right;"> 59 </td> @@ -1969,7 +1989,7 @@ <tr> <td style="text-align:left;"> 544bd1 </td> <td style="text-align:right;"> 10 </td> - <td style="text-align:left;"> female </td> + <td style="text-align:left;"> mujer </td> <td style="text-align:left;"> TRUE </td> <td style="text-align:left;"> 8/29/2014 </td> <td style="text-align:right;"> 39 </td> @@ -1977,7 +1997,7 @@ <tr> <td style="text-align:left;"> 544bd1 </td> <td style="text-align:right;"> 10 </td> - <td style="text-align:left;"> female </td> + <td style="text-align:left;"> mujer </td> <td style="text-align:left;"> TRUE </td> <td style="text-align:left;"> 8/29/2014 </td> <td style="text-align:right;"> 39 </td> @@ -1985,7 +2005,7 @@ <tr> <td style="text-align:left;"> 544bd1 </td> <td style="text-align:right;"> 10 </td> - <td style="text-align:left;"> female </td> + <td style="text-align:left;"> mujer </td> <td style="text-align:left;"> FALSE </td> <td style="text-align:left;"> 8/29/2014 </td> <td style="text-align:right;"> 39 </td> @@ -1997,11 +2017,11 @@ --- -# `mutate()` con fechas +# Usando `mutate()` con fechas -En `class()` de las columnas de fecha debe ser "fecha", no "carácter". +Las columnas de fecha han de ser de `class()` "date" (fecha), no "character" (nominal) -Para cambiar la clase, debes *indicar a* R cómo entender las fechas en bruto. +Para cambiar la clase, debes *indicar* a R cómo entender las fechas en bruto. .pull-left[ @@ -2017,13 +2037,13 @@ ] -.footnote\[Más detalles en este [Capítulo del Manual de Epi](https://epirhandbook.com/en/working-with-dates.html)] +.footnote[Más detalles en este [capítulo del Manual de Epi](https://epirhandbook.com/en/working-with-dates.html)] --- # Convertir a clase fecha -En `mutate()` utiliza el botón {lubridate} que se alinea con la función *formato de fecha en bruto*. +En la función `mutate()`, usa {lubridate} para alinear los *formatos de fechas*. - `ymd()` si los valores brutos son AAAA-MM-DD - `dmy()` si los valores brutos son DD-MM-AAAA @@ -2036,19 +2056,19 @@ ```r surv_clean %>% - select(case_id, date_onset) %>% + select(id_caso, fecha_inicio) %>% tibble() ``` ``` ## # A tibble: 6 × 2 -## case_id date_onset -## <chr> <chr> -## 1 694928 11/9/2014 -## 2 86340d 10/30/2014 -## 3 92d002 8/16/2014 -## 4 544bd1 8/29/2014 -## 5 544bd1 8/29/2014 +## id_caso fecha_inicio +## <chr> <chr> +## 1 694928 11/9/2014 +## 2 86340d 10/30/2014 +## 3 92d002 8/16/2014 +## 4 544bd1 8/29/2014 +## 5 544bd1 8/29/2014 ## 6 544bd1 8/29/2014 ``` @@ -2061,26 +2081,26 @@ ```r surv_clean %>% -* mutate(date_onset = mdy(date_onset)) %>% - select(case_id, date_onset) %>% +* mutate(fecha_inicio = mdy(fecha_inicio)) %>% + select(id_caso, fecha_inicio) %>% tibble() ``` ``` ## # A tibble: 6 × 2 -## case_id date_onset -## <chr> <date> -## 1 694928 2014-11-09 -## 2 86340d 2014-10-30 -## 3 92d002 2014-08-16 -## 4 544bd1 2014-08-29 -## 5 544bd1 2014-08-29 +## id_caso fecha_inicio +## <chr> <date> +## 1 694928 2014-11-09 +## 2 86340d 2014-10-30 +## 3 92d002 2014-08-16 +## 4 544bd1 2014-08-29 +## 5 544bd1 2014-08-29 ## 6 544bd1 2014-08-29 ``` ] -.footnote[La `tibble()` muestra la clase de cada columna encima de sus valores]. +.footnote[`tibble()` muestra la clase de cada columna encima de sus valores] --- @@ -2088,10 +2108,10 @@ ## Ejercicio -Ir al sitio web del curso +Ve al sitio web del curso Abre el ejercicio del Módulo 2 e inicia sesión -Sigue las instrucciones para crear un nuevo proyecto RStudio y empieza a programar -Avisa a un instructor si no estás seguro de lo que tienes que hacer +Sigue las instrucciones para crear un nuevo proyecto de RStudio y empieza a programar +Avisa a un/a instructor/a si no estás seguro de lo que tienes que hacer <img src="../../images/breakout/COVID dominoes.png" width="100%" /> diff --git a/intro/intro02_es/libs/datatables-binding/datatables.js b/intro/intro02_es/libs/datatables-binding/datatables.js index b930851..6a3c3d5 100644 --- a/intro/intro02_es/libs/datatables-binding/datatables.js +++ b/intro/intro02_es/libs/datatables-binding/datatables.js @@ -348,6 +348,15 @@ HTMLWidgets.widget({ var table = $table.DataTable(options); $el.data('datatable', table); + if ('rowGroup' in options) { + // Maintain RowGroup dataSrc when columns are reordered (#1109) + table.on('column-reorder', function(e, settings, details) { + var oldDataSrc = table.rowGroup().dataSrc(); + var newDataSrc = details.mapping[oldDataSrc]; + table.rowGroup().dataSrc(newDataSrc); + }); + } + // Unregister previous Crosstalk event subscriptions, if they exist if (instance.ctfilterSubscription) { instance.ctfilterHandle.off("change", instance.ctfilterSubscription); @@ -432,10 +441,13 @@ HTMLWidgets.widget({ regex = options.search.regex, ci = options.search.caseInsensitive !== false; } + // need to transpose the column index when colReorder is enabled + if (table.colReorder) i = table.colReorder.transpose(i); return table.column(i).search(value, regex, !regex, ci); }; if (data.filter !== 'none') { + if (!data.hasOwnProperty('filterSettings')) data.filterSettings = {}; filterRow.each(function(i, td) { @@ -493,11 +505,13 @@ HTMLWidgets.widget({ $input.parent().hide(); $x.show().trigger('show'); filter[0].selectize.focus(); }, input: function() { - if ($input.val() === '') filter[0].selectize.setValue([]); + var v1 = JSON.stringify(filter[0].selectize.getValue()), v2 = $input.val(); + if (v1 === '[]') v1 = ''; + if (v1 !== v2) filter[0].selectize.setValue(v2 === '' ? [] : JSON.parse(v2)); } }); var $input2 = $x.children('select'); - filter = $input2.selectize({ + filter = $input2.selectize($.extend({ options: $input2.data('options').map(function(v, i) { return ({text: v, value: v}); }), @@ -509,15 +523,14 @@ HTMLWidgets.widget({ if (value.length) $input.trigger('input'); $input.attr('title', $input.val()); if (server) { - table.column(i).search(value.length ? JSON.stringify(value) : '').draw(); + searchColumn(i, value.length ? JSON.stringify(value) : '').draw(); return; } // turn off filter if nothing selected $td.data('filter', value.length > 0); table.draw(); // redraw table, and filters will be applied } - }); - if (searchCol) filter[0].selectize.setValue(JSON.parse(searchCol)); + }, data.filterSettings.select)); filter[0].selectize.on('blur', function() { $x.hide().trigger('hide'); $input.parent().show(); $input.trigger('blur'); }); @@ -526,10 +539,12 @@ HTMLWidgets.widget({ var fun = function() { searchColumn(i, $input.val()).draw(); }; - if (server) { - fun = $.fn.dataTable.util.throttle(fun, options.searchDelay); - } - $input.on('input', fun); + // throttle searching for server-side processing + var throttledFun = $.fn.dataTable.util.throttle(fun, options.searchDelay); + $input.on('input', function(e, immediate) { + // always bypass throttling when immediate = true (via the updateSearch method) + (immediate || !server) ? fun() : throttledFun(); + }); } else if (inArray(type, ['number', 'integer', 'date', 'time'])) { var $x0 = $x; $x = $x0.children('div').first(); @@ -615,13 +630,11 @@ HTMLWidgets.widget({ filter.val(v); } }); - var formatDate = function(d, isoFmt) { + var formatDate = function(d) { d = scaleBack(d, scale); if (type === 'number') return d; if (type === 'integer') return parseInt(d); var x = new Date(+d); - var fmt = ('filterDateFmt' in data) ? data.filterDateFmt[i] : undefined; - if (fmt !== undefined && isoFmt === false) return x[fmt.method].apply(x, fmt.params); if (type === 'date') { var pad0 = function(x) { return ('0' + x).substr(-2, 2); @@ -642,7 +655,7 @@ HTMLWidgets.widget({ start: [r1, r2], range: {min: r1, max: r2}, connect: true - }, opts)); + }, opts, data.filterSettings.slider)); if (scale > 1) (function() { var t1 = r1, t2 = r2; var val = filter.val(); @@ -657,13 +670,28 @@ HTMLWidgets.widget({ start: [t1, t2], range: {min: t1, max: t2}, connect: true - }, opts), true); + }, opts, data.filterSettings.slider), true); val = filter.val(); } r1 = t1; r2 = t2; })(); + // format with active column renderer, if defined + var colDef = data.options.columnDefs.find(function(def) { + return (def.targets === i || inArray(i, def.targets)) && 'render' in def; + }); var updateSliderText = function(v1, v2) { - $span1.text(formatDate(v1, false)); $span2.text(formatDate(v2, false)); + // we only know how to use function renderers + if (colDef && typeof colDef.render === 'function') { + var restore = function(v) { + v = scaleBack(v, scale); + return inArray(type, ['date', 'time']) ? new Date(+v) : v; + } + $span1.text(colDef.render(restore(v1), 'display')); + $span2.text(colDef.render(restore(v2), 'display')); + } else { + $span1.text(formatDate(v1)); + $span2.text(formatDate(v2)); + } }; updateSliderText(r1, r2); var updateSlider = function(e) { @@ -680,7 +708,7 @@ HTMLWidgets.widget({ updateSliderText(val[0], val[1]); if (e.type === 'slide') return; // no searching when sliding only if (server) { - table.column(i).search($td.data('filter') ? ival : '').draw(); + searchColumn(i, $td.data('filter') ? ival : '').draw(); return; } table.draw(); @@ -696,7 +724,7 @@ HTMLWidgets.widget({ // processing if (server) { // if a search string has been pre-set, search now - if (searchCol) searchColumn(i, searchCol).draw(); + if (searchCol) $input.trigger('input').trigger('change'); return; } @@ -742,15 +770,7 @@ HTMLWidgets.widget({ $.fn.dataTable.ext.search.push(customFilter); // search for the preset search strings if it is non-empty - if (searchCol) { - if (inArray(type, ['factor', 'logical'])) { - filter[0].selectize.setValue(JSON.parse(searchCol)); - } else if (type === 'character') { - $input.trigger('input'); - } else if (inArray(type, ['number', 'integer', 'date', 'time'])) { - $input.trigger('change'); - } - } + if (searchCol) $input.trigger('input').trigger('change'); }); @@ -1370,7 +1390,7 @@ HTMLWidgets.widget({ changeInput('cell_clicked', {}); // do not trigger table selection when clicking on links unless they have classes - table.on('click.dt', 'tbody td a', function(e) { + table.on('mousedown.dt', 'tbody td a', function(e) { if (this.className === '') e.stopPropagation(); }); @@ -1398,8 +1418,9 @@ HTMLWidgets.widget({ console.log('The search keyword for column ' + i + ' is undefined') return; } - $(td).find('input').first().val(v); - searchColumn(i, v); + // Update column search string and values on linked filter widgets. + // 'input' for factor and char filters, 'change' for numeric filters. + $(td).find('input').first().val(v).trigger('input', [true]).trigger('change'); }); table.draw(); } diff --git a/intro/intro02_es/libs/dt-core/css/jquery.dataTables.min.css b/intro/intro02_es/libs/dt-core/css/jquery.dataTables.min.css index aff1ca6..ad59f84 100644 --- a/intro/intro02_es/libs/dt-core/css/jquery.dataTables.min.css +++ b/intro/intro02_es/libs/dt-core/css/jquery.dataTables.min.css @@ -1 +1 @@ -:root{--dt-row-selected: 13, 110, 253;--dt-row-selected-text: 255, 255, 255;--dt-row-selected-link: 9, 10, 11}table.dataTable td.dt-control{text-align:center;cursor:pointer}table.dataTable td.dt-control:before{height:1em;width:1em;margin-top:-9px;display:inline-block;color:white;border:.15em solid white;border-radius:1em;box-shadow:0 0 .2em #444;box-sizing:content-box;text-align:center;text-indent:0 !important;font-family:"Courier New",Courier,monospace;line-height:1em;content:"+";background-color:#31b131}table.dataTable tr.dt-hasChild td.dt-control:before{content:"-";background-color:#d33333}table.dataTable thead>tr>th.sorting,table.dataTable thead>tr>th.sorting_asc,table.dataTable thead>tr>th.sorting_desc,table.dataTable thead>tr>th.sorting_asc_disabled,table.dataTable thead>tr>th.sorting_desc_disabled,table.dataTable thead>tr>td.sorting,table.dataTable thead>tr>td.sorting_asc,table.dataTable thead>tr>td.sorting_desc,table.dataTable thead>tr>td.sorting_asc_disabled,table.dataTable thead>tr>td.sorting_desc_disabled{cursor:pointer;position:relative;padding-right:26px}table.dataTable thead>tr>th.sorting:before,table.dataTable thead>tr>th.sorting:after,table.dataTable thead>tr>th.sorting_asc:before,table.dataTable thead>tr>th.sorting_asc:after,table.dataTable thead>tr>th.sorting_desc:before,table.dataTable thead>tr>th.sorting_desc:after,table.dataTable thead>tr>th.sorting_asc_disabled:before,table.dataTable thead>tr>th.sorting_asc_disabled:after,table.dataTable thead>tr>th.sorting_desc_disabled:before,table.dataTable thead>tr>th.sorting_desc_disabled:after,table.dataTable thead>tr>td.sorting:before,table.dataTable thead>tr>td.sorting:after,table.dataTable thead>tr>td.sorting_asc:before,table.dataTable thead>tr>td.sorting_asc:after,table.dataTable thead>tr>td.sorting_desc:before,table.dataTable thead>tr>td.sorting_desc:after,table.dataTable thead>tr>td.sorting_asc_disabled:before,table.dataTable thead>tr>td.sorting_asc_disabled:after,table.dataTable thead>tr>td.sorting_desc_disabled:before,table.dataTable thead>tr>td.sorting_desc_disabled:after{position:absolute;display:block;opacity:.125;right:10px;line-height:9px;font-size:.8em}table.dataTable thead>tr>th.sorting:before,table.dataTable thead>tr>th.sorting_asc:before,table.dataTable thead>tr>th.sorting_desc:before,table.dataTable thead>tr>th.sorting_asc_disabled:before,table.dataTable thead>tr>th.sorting_desc_disabled:before,table.dataTable thead>tr>td.sorting:before,table.dataTable thead>tr>td.sorting_asc:before,table.dataTable thead>tr>td.sorting_desc:before,table.dataTable thead>tr>td.sorting_asc_disabled:before,table.dataTable thead>tr>td.sorting_desc_disabled:before{bottom:50%;content:"▲";content:"▲"/""}table.dataTable thead>tr>th.sorting:after,table.dataTable thead>tr>th.sorting_asc:after,table.dataTable thead>tr>th.sorting_desc:after,table.dataTable thead>tr>th.sorting_asc_disabled:after,table.dataTable thead>tr>th.sorting_desc_disabled:after,table.dataTable thead>tr>td.sorting:after,table.dataTable thead>tr>td.sorting_asc:after,table.dataTable thead>tr>td.sorting_desc:after,table.dataTable thead>tr>td.sorting_asc_disabled:after,table.dataTable thead>tr>td.sorting_desc_disabled:after{top:50%;content:"▼";content:"▼"/""}table.dataTable thead>tr>th.sorting_asc:before,table.dataTable thead>tr>th.sorting_desc:after,table.dataTable thead>tr>td.sorting_asc:before,table.dataTable thead>tr>td.sorting_desc:after{opacity:.6}table.dataTable thead>tr>th.sorting_desc_disabled:after,table.dataTable thead>tr>th.sorting_asc_disabled:before,table.dataTable thead>tr>td.sorting_desc_disabled:after,table.dataTable thead>tr>td.sorting_asc_disabled:before{display:none}table.dataTable thead>tr>th:active,table.dataTable thead>tr>td:active{outline:none}div.dataTables_scrollBody>table.dataTable>thead>tr>th:before,div.dataTables_scrollBody>table.dataTable>thead>tr>th:after,div.dataTables_scrollBody>table.dataTable>thead>tr>td:before,div.dataTables_scrollBody>table.dataTable>thead>tr>td:after{display:none}div.dataTables_processing{position:absolute;top:50%;left:50%;width:200px;margin-left:-100px;margin-top:-26px;text-align:center;padding:2px}div.dataTables_processing>div:last-child{position:relative;width:80px;height:15px;margin:1em auto}div.dataTables_processing>div:last-child>div{position:absolute;top:0;width:13px;height:13px;border-radius:50%;background:rgb(13, 110, 253);background:rgb(var(--dt-row-selected));animation-timing-function:cubic-bezier(0, 1, 1, 0)}div.dataTables_processing>div:last-child>div:nth-child(1){left:8px;animation:datatables-loader-1 .6s infinite}div.dataTables_processing>div:last-child>div:nth-child(2){left:8px;animation:datatables-loader-2 .6s infinite}div.dataTables_processing>div:last-child>div:nth-child(3){left:32px;animation:datatables-loader-2 .6s infinite}div.dataTables_processing>div:last-child>div:nth-child(4){left:56px;animation:datatables-loader-3 .6s infinite}@keyframes datatables-loader-1{0%{transform:scale(0)}100%{transform:scale(1)}}@keyframes datatables-loader-3{0%{transform:scale(1)}100%{transform:scale(0)}}@keyframes datatables-loader-2{0%{transform:translate(0, 0)}100%{transform:translate(24px, 0)}}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}table.dataTable th.dt-left,table.dataTable td.dt-left{text-align:left}table.dataTable th.dt-center,table.dataTable td.dt-center,table.dataTable td.dataTables_empty{text-align:center}table.dataTable th.dt-right,table.dataTable td.dt-right{text-align:right}table.dataTable th.dt-justify,table.dataTable td.dt-justify{text-align:justify}table.dataTable th.dt-nowrap,table.dataTable td.dt-nowrap{white-space:nowrap}table.dataTable thead th,table.dataTable thead td,table.dataTable tfoot th,table.dataTable tfoot td{text-align:left}table.dataTable thead th.dt-head-left,table.dataTable thead td.dt-head-left,table.dataTable tfoot th.dt-head-left,table.dataTable tfoot td.dt-head-left{text-align:left}table.dataTable thead th.dt-head-center,table.dataTable thead td.dt-head-center,table.dataTable tfoot th.dt-head-center,table.dataTable tfoot td.dt-head-center{text-align:center}table.dataTable thead th.dt-head-right,table.dataTable thead td.dt-head-right,table.dataTable tfoot th.dt-head-right,table.dataTable tfoot td.dt-head-right{text-align:right}table.dataTable thead th.dt-head-justify,table.dataTable thead td.dt-head-justify,table.dataTable tfoot th.dt-head-justify,table.dataTable tfoot td.dt-head-justify{text-align:justify}table.dataTable thead th.dt-head-nowrap,table.dataTable thead td.dt-head-nowrap,table.dataTable tfoot th.dt-head-nowrap,table.dataTable tfoot td.dt-head-nowrap{white-space:nowrap}table.dataTable tbody th.dt-body-left,table.dataTable tbody td.dt-body-left{text-align:left}table.dataTable tbody th.dt-body-center,table.dataTable tbody td.dt-body-center{text-align:center}table.dataTable tbody th.dt-body-right,table.dataTable tbody td.dt-body-right{text-align:right}table.dataTable tbody th.dt-body-justify,table.dataTable tbody td.dt-body-justify{text-align:justify}table.dataTable tbody th.dt-body-nowrap,table.dataTable tbody td.dt-body-nowrap{white-space:nowrap}table.dataTable{width:100%;margin:0 auto;clear:both;border-collapse:separate;border-spacing:0}table.dataTable thead th,table.dataTable tfoot th{font-weight:bold}table.dataTable thead th,table.dataTable thead td{padding:10px;border-bottom:1px solid rgba(0, 0, 0, 0.3)}table.dataTable thead th:active,table.dataTable thead td:active{outline:none}table.dataTable tfoot th,table.dataTable tfoot td{padding:10px 10px 6px 10px;border-top:1px solid rgba(0, 0, 0, 0.3)}table.dataTable tbody tr{background-color:transparent}table.dataTable tbody tr.selected>*{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.9);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.9);color:rgb(255, 255, 255);color:rgb(var(--dt-row-selected-text))}table.dataTable tbody tr.selected a{color:rgb(9, 10, 11);color:rgb(var(--dt-row-selected-link))}table.dataTable tbody th,table.dataTable tbody td{padding:8px 10px}table.dataTable.row-border tbody th,table.dataTable.row-border tbody td,table.dataTable.display tbody th,table.dataTable.display tbody td{border-top:1px solid rgba(0, 0, 0, 0.15)}table.dataTable.row-border tbody tr:first-child th,table.dataTable.row-border tbody tr:first-child td,table.dataTable.display tbody tr:first-child th,table.dataTable.display tbody tr:first-child td{border-top:none}table.dataTable.cell-border tbody th,table.dataTable.cell-border tbody td{border-top:1px solid rgba(0, 0, 0, 0.15);border-right:1px solid rgba(0, 0, 0, 0.15)}table.dataTable.cell-border tbody tr th:first-child,table.dataTable.cell-border tbody tr td:first-child{border-left:1px solid rgba(0, 0, 0, 0.15)}table.dataTable.cell-border tbody tr:first-child th,table.dataTable.cell-border tbody tr:first-child td{border-top:none}table.dataTable.stripe>tbody>tr.odd>*,table.dataTable.display>tbody>tr.odd>*{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.023)}table.dataTable.stripe>tbody>tr.odd.selected>*,table.dataTable.display>tbody>tr.odd.selected>*{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.923);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected, 0.923))}table.dataTable.hover>tbody>tr:hover>*,table.dataTable.display>tbody>tr:hover>*{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.035)}table.dataTable.hover>tbody>tr.selected:hover>*,table.dataTable.display>tbody>tr.selected:hover>*{box-shadow:inset 0 0 0 9999px #0d6efd !important;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected, 1)) !important}table.dataTable.order-column>tbody tr>.sorting_1,table.dataTable.order-column>tbody tr>.sorting_2,table.dataTable.order-column>tbody tr>.sorting_3,table.dataTable.display>tbody tr>.sorting_1,table.dataTable.display>tbody tr>.sorting_2,table.dataTable.display>tbody tr>.sorting_3{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.019)}table.dataTable.order-column>tbody tr.selected>.sorting_1,table.dataTable.order-column>tbody tr.selected>.sorting_2,table.dataTable.order-column>tbody tr.selected>.sorting_3,table.dataTable.display>tbody tr.selected>.sorting_1,table.dataTable.display>tbody tr.selected>.sorting_2,table.dataTable.display>tbody tr.selected>.sorting_3{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.919);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected, 0.919))}table.dataTable.display>tbody>tr.odd>.sorting_1,table.dataTable.order-column.stripe>tbody>tr.odd>.sorting_1{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.054)}table.dataTable.display>tbody>tr.odd>.sorting_2,table.dataTable.order-column.stripe>tbody>tr.odd>.sorting_2{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.047)}table.dataTable.display>tbody>tr.odd>.sorting_3,table.dataTable.order-column.stripe>tbody>tr.odd>.sorting_3{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.039)}table.dataTable.display>tbody>tr.odd.selected>.sorting_1,table.dataTable.order-column.stripe>tbody>tr.odd.selected>.sorting_1{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.954);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected, 0.954))}table.dataTable.display>tbody>tr.odd.selected>.sorting_2,table.dataTable.order-column.stripe>tbody>tr.odd.selected>.sorting_2{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.947);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected, 0.947))}table.dataTable.display>tbody>tr.odd.selected>.sorting_3,table.dataTable.order-column.stripe>tbody>tr.odd.selected>.sorting_3{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.939);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected, 0.939))}table.dataTable.display>tbody>tr.even>.sorting_1,table.dataTable.order-column.stripe>tbody>tr.even>.sorting_1{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.019)}table.dataTable.display>tbody>tr.even>.sorting_2,table.dataTable.order-column.stripe>tbody>tr.even>.sorting_2{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.011)}table.dataTable.display>tbody>tr.even>.sorting_3,table.dataTable.order-column.stripe>tbody>tr.even>.sorting_3{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.003)}table.dataTable.display>tbody>tr.even.selected>.sorting_1,table.dataTable.order-column.stripe>tbody>tr.even.selected>.sorting_1{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.919);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected, 0.919))}table.dataTable.display>tbody>tr.even.selected>.sorting_2,table.dataTable.order-column.stripe>tbody>tr.even.selected>.sorting_2{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.911);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected, 0.911))}table.dataTable.display>tbody>tr.even.selected>.sorting_3,table.dataTable.order-column.stripe>tbody>tr.even.selected>.sorting_3{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.903);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected, 0.903))}table.dataTable.display tbody tr:hover>.sorting_1,table.dataTable.order-column.hover tbody tr:hover>.sorting_1{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.082)}table.dataTable.display tbody tr:hover>.sorting_2,table.dataTable.order-column.hover tbody tr:hover>.sorting_2{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.074)}table.dataTable.display tbody tr:hover>.sorting_3,table.dataTable.order-column.hover tbody tr:hover>.sorting_3{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.062)}table.dataTable.display tbody tr:hover.selected>.sorting_1,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_1{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.982);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected, 0.982))}table.dataTable.display tbody tr:hover.selected>.sorting_2,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_2{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.974);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected, 0.974))}table.dataTable.display tbody tr:hover.selected>.sorting_3,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_3{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.962);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected, 0.962))}table.dataTable.no-footer{border-bottom:1px solid rgba(0, 0, 0, 0.3)}table.dataTable.compact thead th,table.dataTable.compact thead td,table.dataTable.compact tfoot th,table.dataTable.compact tfoot td,table.dataTable.compact tbody th,table.dataTable.compact tbody td{padding:4px}table.dataTable th,table.dataTable td{box-sizing:content-box}.dataTables_wrapper{position:relative;clear:both}.dataTables_wrapper .dataTables_length{float:left}.dataTables_wrapper .dataTables_length select{border:1px solid #aaa;border-radius:3px;padding:5px;background-color:transparent;padding:4px}.dataTables_wrapper .dataTables_filter{float:right;text-align:right}.dataTables_wrapper .dataTables_filter input{border:1px solid #aaa;border-radius:3px;padding:5px;background-color:transparent;margin-left:3px}.dataTables_wrapper .dataTables_info{clear:both;float:left;padding-top:.755em}.dataTables_wrapper .dataTables_paginate{float:right;text-align:right;padding-top:.25em}.dataTables_wrapper .dataTables_paginate .paginate_button{box-sizing:border-box;display:inline-block;min-width:1.5em;padding:.5em 1em;margin-left:2px;text-align:center;text-decoration:none !important;cursor:pointer;color:inherit !important;border:1px solid transparent;border-radius:2px;background:transparent}.dataTables_wrapper .dataTables_paginate .paginate_button.current,.dataTables_wrapper .dataTables_paginate .paginate_button.current:hover{color:inherit !important;border:1px solid rgba(0, 0, 0, 0.3);background-color:rgba(230, 230, 230, 0.1);background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, rgba(230, 230, 230, 0.1)), color-stop(100%, rgba(0, 0, 0, 0.1)));background:-webkit-linear-gradient(top, rgba(230, 230, 230, 0.1) 0%, rgba(0, 0, 0, 0.1) 100%);background:-moz-linear-gradient(top, rgba(230, 230, 230, 0.1) 0%, rgba(0, 0, 0, 0.1) 100%);background:-ms-linear-gradient(top, rgba(230, 230, 230, 0.1) 0%, rgba(0, 0, 0, 0.1) 100%);background:-o-linear-gradient(top, rgba(230, 230, 230, 0.1) 0%, rgba(0, 0, 0, 0.1) 100%);background:linear-gradient(to bottom, rgba(230, 230, 230, 0.1) 0%, rgba(0, 0, 0, 0.1) 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button.disabled,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active{cursor:default;color:#666 !important;border:1px solid transparent;background:transparent;box-shadow:none}.dataTables_wrapper .dataTables_paginate .paginate_button:hover{color:white !important;border:1px solid #111;background-color:#585858;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #585858), color-stop(100%, #111));background:-webkit-linear-gradient(top, #585858 0%, #111 100%);background:-moz-linear-gradient(top, #585858 0%, #111 100%);background:-ms-linear-gradient(top, #585858 0%, #111 100%);background:-o-linear-gradient(top, #585858 0%, #111 100%);background:linear-gradient(to bottom, #585858 0%, #111 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button:active{outline:none;background-color:#2b2b2b;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #2b2b2b), color-stop(100%, #0c0c0c));background:-webkit-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-moz-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-ms-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-o-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:linear-gradient(to bottom, #2b2b2b 0%, #0c0c0c 100%);box-shadow:inset 0 0 3px #111}.dataTables_wrapper .dataTables_paginate .ellipsis{padding:0 1em}.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter,.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_processing,.dataTables_wrapper .dataTables_paginate{color:inherit}.dataTables_wrapper .dataTables_scroll{clear:both}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody{-webkit-overflow-scrolling:touch}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>th,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>td,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>th,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>td{vertical-align:middle}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>th>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>td>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>th>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>td>div.dataTables_sizing{height:0;overflow:hidden;margin:0 !important;padding:0 !important}.dataTables_wrapper.no-footer .dataTables_scrollBody{border-bottom:1px solid rgba(0, 0, 0, 0.3)}.dataTables_wrapper.no-footer div.dataTables_scrollHead table.dataTable,.dataTables_wrapper.no-footer div.dataTables_scrollBody>table{border-bottom:none}.dataTables_wrapper:after{visibility:hidden;display:block;content:"";clear:both;height:0}@media screen and (max-width: 767px){.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_paginate{float:none;text-align:center}.dataTables_wrapper .dataTables_paginate{margin-top:.5em}}@media screen and (max-width: 640px){.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter{float:none;text-align:center}.dataTables_wrapper .dataTables_filter{margin-top:.5em}} +:root{--dt-row-selected: 13, 110, 253;--dt-row-selected-text: 255, 255, 255;--dt-row-selected-link: 9, 10, 11;--dt-row-stripe: 0, 0, 0;--dt-row-hover: 0, 0, 0;--dt-column-ordering: 0, 0, 0;--dt-html-background: white}:root.dark{--dt-html-background: rgb(33, 37, 41)}table.dataTable td.dt-control{text-align:center;cursor:pointer}table.dataTable td.dt-control:before{display:inline-block;color:rgba(0, 0, 0, 0.5);content:"►"}table.dataTable tr.dt-hasChild td.dt-control:before{content:"▼"}html.dark table.dataTable td.dt-control:before{color:rgba(255, 255, 255, 0.5)}html.dark table.dataTable tr.dt-hasChild td.dt-control:before{color:rgba(255, 255, 255, 0.5)}table.dataTable thead>tr>th.sorting,table.dataTable thead>tr>th.sorting_asc,table.dataTable thead>tr>th.sorting_desc,table.dataTable thead>tr>th.sorting_asc_disabled,table.dataTable thead>tr>th.sorting_desc_disabled,table.dataTable thead>tr>td.sorting,table.dataTable thead>tr>td.sorting_asc,table.dataTable thead>tr>td.sorting_desc,table.dataTable thead>tr>td.sorting_asc_disabled,table.dataTable thead>tr>td.sorting_desc_disabled{cursor:pointer;position:relative;padding-right:26px}table.dataTable thead>tr>th.sorting:before,table.dataTable thead>tr>th.sorting:after,table.dataTable thead>tr>th.sorting_asc:before,table.dataTable thead>tr>th.sorting_asc:after,table.dataTable thead>tr>th.sorting_desc:before,table.dataTable thead>tr>th.sorting_desc:after,table.dataTable thead>tr>th.sorting_asc_disabled:before,table.dataTable thead>tr>th.sorting_asc_disabled:after,table.dataTable thead>tr>th.sorting_desc_disabled:before,table.dataTable thead>tr>th.sorting_desc_disabled:after,table.dataTable thead>tr>td.sorting:before,table.dataTable thead>tr>td.sorting:after,table.dataTable thead>tr>td.sorting_asc:before,table.dataTable thead>tr>td.sorting_asc:after,table.dataTable thead>tr>td.sorting_desc:before,table.dataTable thead>tr>td.sorting_desc:after,table.dataTable thead>tr>td.sorting_asc_disabled:before,table.dataTable thead>tr>td.sorting_asc_disabled:after,table.dataTable thead>tr>td.sorting_desc_disabled:before,table.dataTable thead>tr>td.sorting_desc_disabled:after{position:absolute;display:block;opacity:.125;right:10px;line-height:9px;font-size:.8em}table.dataTable thead>tr>th.sorting:before,table.dataTable thead>tr>th.sorting_asc:before,table.dataTable thead>tr>th.sorting_desc:before,table.dataTable thead>tr>th.sorting_asc_disabled:before,table.dataTable thead>tr>th.sorting_desc_disabled:before,table.dataTable thead>tr>td.sorting:before,table.dataTable thead>tr>td.sorting_asc:before,table.dataTable thead>tr>td.sorting_desc:before,table.dataTable thead>tr>td.sorting_asc_disabled:before,table.dataTable thead>tr>td.sorting_desc_disabled:before{bottom:50%;content:"▲";content:"▲"/""}table.dataTable thead>tr>th.sorting:after,table.dataTable thead>tr>th.sorting_asc:after,table.dataTable thead>tr>th.sorting_desc:after,table.dataTable thead>tr>th.sorting_asc_disabled:after,table.dataTable thead>tr>th.sorting_desc_disabled:after,table.dataTable thead>tr>td.sorting:after,table.dataTable thead>tr>td.sorting_asc:after,table.dataTable thead>tr>td.sorting_desc:after,table.dataTable thead>tr>td.sorting_asc_disabled:after,table.dataTable thead>tr>td.sorting_desc_disabled:after{top:50%;content:"▼";content:"▼"/""}table.dataTable thead>tr>th.sorting_asc:before,table.dataTable thead>tr>th.sorting_desc:after,table.dataTable thead>tr>td.sorting_asc:before,table.dataTable thead>tr>td.sorting_desc:after{opacity:.6}table.dataTable thead>tr>th.sorting_desc_disabled:after,table.dataTable thead>tr>th.sorting_asc_disabled:before,table.dataTable thead>tr>td.sorting_desc_disabled:after,table.dataTable thead>tr>td.sorting_asc_disabled:before{display:none}table.dataTable thead>tr>th:active,table.dataTable thead>tr>td:active{outline:none}div.dataTables_scrollBody>table.dataTable>thead>tr>th:before,div.dataTables_scrollBody>table.dataTable>thead>tr>th:after,div.dataTables_scrollBody>table.dataTable>thead>tr>td:before,div.dataTables_scrollBody>table.dataTable>thead>tr>td:after{display:none}div.dataTables_processing{position:absolute;top:50%;left:50%;width:200px;margin-left:-100px;margin-top:-26px;text-align:center;padding:2px}div.dataTables_processing>div:last-child{position:relative;width:80px;height:15px;margin:1em auto}div.dataTables_processing>div:last-child>div{position:absolute;top:0;width:13px;height:13px;border-radius:50%;background:rgb(13, 110, 253);background:rgb(var(--dt-row-selected));animation-timing-function:cubic-bezier(0, 1, 1, 0)}div.dataTables_processing>div:last-child>div:nth-child(1){left:8px;animation:datatables-loader-1 .6s infinite}div.dataTables_processing>div:last-child>div:nth-child(2){left:8px;animation:datatables-loader-2 .6s infinite}div.dataTables_processing>div:last-child>div:nth-child(3){left:32px;animation:datatables-loader-2 .6s infinite}div.dataTables_processing>div:last-child>div:nth-child(4){left:56px;animation:datatables-loader-3 .6s infinite}@keyframes datatables-loader-1{0%{transform:scale(0)}100%{transform:scale(1)}}@keyframes datatables-loader-3{0%{transform:scale(1)}100%{transform:scale(0)}}@keyframes datatables-loader-2{0%{transform:translate(0, 0)}100%{transform:translate(24px, 0)}}table.dataTable.nowrap th,table.dataTable.nowrap td{white-space:nowrap}table.dataTable th.dt-left,table.dataTable td.dt-left{text-align:left}table.dataTable th.dt-center,table.dataTable td.dt-center,table.dataTable td.dataTables_empty{text-align:center}table.dataTable th.dt-right,table.dataTable td.dt-right{text-align:right}table.dataTable th.dt-justify,table.dataTable td.dt-justify{text-align:justify}table.dataTable th.dt-nowrap,table.dataTable td.dt-nowrap{white-space:nowrap}table.dataTable thead th,table.dataTable thead td,table.dataTable tfoot th,table.dataTable tfoot td{text-align:left}table.dataTable thead th.dt-head-left,table.dataTable thead td.dt-head-left,table.dataTable tfoot th.dt-head-left,table.dataTable tfoot td.dt-head-left{text-align:left}table.dataTable thead th.dt-head-center,table.dataTable thead td.dt-head-center,table.dataTable tfoot th.dt-head-center,table.dataTable tfoot td.dt-head-center{text-align:center}table.dataTable thead th.dt-head-right,table.dataTable thead td.dt-head-right,table.dataTable tfoot th.dt-head-right,table.dataTable tfoot td.dt-head-right{text-align:right}table.dataTable thead th.dt-head-justify,table.dataTable thead td.dt-head-justify,table.dataTable tfoot th.dt-head-justify,table.dataTable tfoot td.dt-head-justify{text-align:justify}table.dataTable thead th.dt-head-nowrap,table.dataTable thead td.dt-head-nowrap,table.dataTable tfoot th.dt-head-nowrap,table.dataTable tfoot td.dt-head-nowrap{white-space:nowrap}table.dataTable tbody th.dt-body-left,table.dataTable tbody td.dt-body-left{text-align:left}table.dataTable tbody th.dt-body-center,table.dataTable tbody td.dt-body-center{text-align:center}table.dataTable tbody th.dt-body-right,table.dataTable tbody td.dt-body-right{text-align:right}table.dataTable tbody th.dt-body-justify,table.dataTable tbody td.dt-body-justify{text-align:justify}table.dataTable tbody th.dt-body-nowrap,table.dataTable tbody td.dt-body-nowrap{white-space:nowrap}table.dataTable{width:100%;margin:0 auto;clear:both;border-collapse:separate;border-spacing:0}table.dataTable thead th,table.dataTable tfoot th{font-weight:bold}table.dataTable>thead>tr>th,table.dataTable>thead>tr>td{padding:10px;border-bottom:1px solid rgba(0, 0, 0, 0.3)}table.dataTable>thead>tr>th:active,table.dataTable>thead>tr>td:active{outline:none}table.dataTable>tfoot>tr>th,table.dataTable>tfoot>tr>td{padding:10px 10px 6px 10px;border-top:1px solid rgba(0, 0, 0, 0.3)}table.dataTable tbody tr{background-color:transparent}table.dataTable tbody tr.selected>*{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.9);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.9);color:rgb(255, 255, 255);color:rgb(var(--dt-row-selected-text))}table.dataTable tbody tr.selected a{color:rgb(9, 10, 11);color:rgb(var(--dt-row-selected-link))}table.dataTable tbody th,table.dataTable tbody td{padding:8px 10px}table.dataTable.row-border>tbody>tr>th,table.dataTable.row-border>tbody>tr>td,table.dataTable.display>tbody>tr>th,table.dataTable.display>tbody>tr>td{border-top:1px solid rgba(0, 0, 0, 0.15)}table.dataTable.row-border>tbody>tr:first-child>th,table.dataTable.row-border>tbody>tr:first-child>td,table.dataTable.display>tbody>tr:first-child>th,table.dataTable.display>tbody>tr:first-child>td{border-top:none}table.dataTable.row-border>tbody>tr.selected+tr.selected>td,table.dataTable.display>tbody>tr.selected+tr.selected>td{border-top-color:#0262ef}table.dataTable.cell-border>tbody>tr>th,table.dataTable.cell-border>tbody>tr>td{border-top:1px solid rgba(0, 0, 0, 0.15);border-right:1px solid rgba(0, 0, 0, 0.15)}table.dataTable.cell-border>tbody>tr>th:first-child,table.dataTable.cell-border>tbody>tr>td:first-child{border-left:1px solid rgba(0, 0, 0, 0.15)}table.dataTable.cell-border>tbody>tr:first-child>th,table.dataTable.cell-border>tbody>tr:first-child>td{border-top:none}table.dataTable.stripe>tbody>tr.odd>*,table.dataTable.display>tbody>tr.odd>*{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.023);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-stripe), 0.023)}table.dataTable.stripe>tbody>tr.odd.selected>*,table.dataTable.display>tbody>tr.odd.selected>*{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.923);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.923)}table.dataTable.hover>tbody>tr:hover>*,table.dataTable.display>tbody>tr:hover>*{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.035);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-hover), 0.035)}table.dataTable.hover>tbody>tr.selected:hover>*,table.dataTable.display>tbody>tr.selected:hover>*{box-shadow:inset 0 0 0 9999px #0d6efd !important;box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 1) !important}table.dataTable.order-column>tbody tr>.sorting_1,table.dataTable.order-column>tbody tr>.sorting_2,table.dataTable.order-column>tbody tr>.sorting_3,table.dataTable.display>tbody tr>.sorting_1,table.dataTable.display>tbody tr>.sorting_2,table.dataTable.display>tbody tr>.sorting_3{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.019);box-shadow:inset 0 0 0 9999px rgba(var(--dt-column-ordering), 0.019)}table.dataTable.order-column>tbody tr.selected>.sorting_1,table.dataTable.order-column>tbody tr.selected>.sorting_2,table.dataTable.order-column>tbody tr.selected>.sorting_3,table.dataTable.display>tbody tr.selected>.sorting_1,table.dataTable.display>tbody tr.selected>.sorting_2,table.dataTable.display>tbody tr.selected>.sorting_3{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.919);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.919)}table.dataTable.display>tbody>tr.odd>.sorting_1,table.dataTable.order-column.stripe>tbody>tr.odd>.sorting_1{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.054);box-shadow:inset 0 0 0 9999px rgba(var(--dt-column-ordering), 0.054)}table.dataTable.display>tbody>tr.odd>.sorting_2,table.dataTable.order-column.stripe>tbody>tr.odd>.sorting_2{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.047);box-shadow:inset 0 0 0 9999px rgba(var(--dt-column-ordering), 0.047)}table.dataTable.display>tbody>tr.odd>.sorting_3,table.dataTable.order-column.stripe>tbody>tr.odd>.sorting_3{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.039);box-shadow:inset 0 0 0 9999px rgba(var(--dt-column-ordering), 0.039)}table.dataTable.display>tbody>tr.odd.selected>.sorting_1,table.dataTable.order-column.stripe>tbody>tr.odd.selected>.sorting_1{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.954);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.954)}table.dataTable.display>tbody>tr.odd.selected>.sorting_2,table.dataTable.order-column.stripe>tbody>tr.odd.selected>.sorting_2{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.947);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.947)}table.dataTable.display>tbody>tr.odd.selected>.sorting_3,table.dataTable.order-column.stripe>tbody>tr.odd.selected>.sorting_3{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.939);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.939)}table.dataTable.display>tbody>tr.even>.sorting_1,table.dataTable.order-column.stripe>tbody>tr.even>.sorting_1{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.019);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.019)}table.dataTable.display>tbody>tr.even>.sorting_2,table.dataTable.order-column.stripe>tbody>tr.even>.sorting_2{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.011);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.011)}table.dataTable.display>tbody>tr.even>.sorting_3,table.dataTable.order-column.stripe>tbody>tr.even>.sorting_3{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.003);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.003)}table.dataTable.display>tbody>tr.even.selected>.sorting_1,table.dataTable.order-column.stripe>tbody>tr.even.selected>.sorting_1{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.919);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.919)}table.dataTable.display>tbody>tr.even.selected>.sorting_2,table.dataTable.order-column.stripe>tbody>tr.even.selected>.sorting_2{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.911);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.911)}table.dataTable.display>tbody>tr.even.selected>.sorting_3,table.dataTable.order-column.stripe>tbody>tr.even.selected>.sorting_3{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.903);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.903)}table.dataTable.display tbody tr:hover>.sorting_1,table.dataTable.order-column.hover tbody tr:hover>.sorting_1{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.082);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-hover), 0.082)}table.dataTable.display tbody tr:hover>.sorting_2,table.dataTable.order-column.hover tbody tr:hover>.sorting_2{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.074);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-hover), 0.074)}table.dataTable.display tbody tr:hover>.sorting_3,table.dataTable.order-column.hover tbody tr:hover>.sorting_3{box-shadow:inset 0 0 0 9999px rgba(0, 0, 0, 0.062);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-hover), 0.062)}table.dataTable.display tbody tr:hover.selected>.sorting_1,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_1{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.982);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.982)}table.dataTable.display tbody tr:hover.selected>.sorting_2,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_2{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.974);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.974)}table.dataTable.display tbody tr:hover.selected>.sorting_3,table.dataTable.order-column.hover tbody tr:hover.selected>.sorting_3{box-shadow:inset 0 0 0 9999px rgba(13, 110, 253, 0.962);box-shadow:inset 0 0 0 9999px rgba(var(--dt-row-selected), 0.962)}table.dataTable.no-footer{border-bottom:1px solid rgba(0, 0, 0, 0.3)}table.dataTable.compact thead th,table.dataTable.compact thead td,table.dataTable.compact tfoot th,table.dataTable.compact tfoot td,table.dataTable.compact tbody th,table.dataTable.compact tbody td{padding:4px}table.dataTable th,table.dataTable td{box-sizing:content-box}.dataTables_wrapper{position:relative;clear:both}.dataTables_wrapper .dataTables_length{float:left}.dataTables_wrapper .dataTables_length select{border:1px solid #aaa;border-radius:3px;padding:5px;background-color:transparent;color:inherit;padding:4px}.dataTables_wrapper .dataTables_filter{float:right;text-align:right}.dataTables_wrapper .dataTables_filter input{border:1px solid #aaa;border-radius:3px;padding:5px;background-color:transparent;color:inherit;margin-left:3px}.dataTables_wrapper .dataTables_info{clear:both;float:left;padding-top:.755em}.dataTables_wrapper .dataTables_paginate{float:right;text-align:right;padding-top:.25em}.dataTables_wrapper .dataTables_paginate .paginate_button{box-sizing:border-box;display:inline-block;min-width:1.5em;padding:.5em 1em;margin-left:2px;text-align:center;text-decoration:none !important;cursor:pointer;color:inherit !important;border:1px solid transparent;border-radius:2px;background:transparent}.dataTables_wrapper .dataTables_paginate .paginate_button.current,.dataTables_wrapper .dataTables_paginate .paginate_button.current:hover{color:inherit !important;border:1px solid rgba(0, 0, 0, 0.3);background-color:rgba(0, 0, 0, 0.05);background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, rgba(230, 230, 230, 0.05)), color-stop(100%, rgba(0, 0, 0, 0.05)));background:-webkit-linear-gradient(top, rgba(230, 230, 230, 0.05) 0%, rgba(0, 0, 0, 0.05) 100%);background:-moz-linear-gradient(top, rgba(230, 230, 230, 0.05) 0%, rgba(0, 0, 0, 0.05) 100%);background:-ms-linear-gradient(top, rgba(230, 230, 230, 0.05) 0%, rgba(0, 0, 0, 0.05) 100%);background:-o-linear-gradient(top, rgba(230, 230, 230, 0.05) 0%, rgba(0, 0, 0, 0.05) 100%);background:linear-gradient(to bottom, rgba(230, 230, 230, 0.05) 0%, rgba(0, 0, 0, 0.05) 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button.disabled,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover,.dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active{cursor:default;color:#666 !important;border:1px solid transparent;background:transparent;box-shadow:none}.dataTables_wrapper .dataTables_paginate .paginate_button:hover{color:white !important;border:1px solid #111;background-color:#111;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #585858), color-stop(100%, #111));background:-webkit-linear-gradient(top, #585858 0%, #111 100%);background:-moz-linear-gradient(top, #585858 0%, #111 100%);background:-ms-linear-gradient(top, #585858 0%, #111 100%);background:-o-linear-gradient(top, #585858 0%, #111 100%);background:linear-gradient(to bottom, #585858 0%, #111 100%)}.dataTables_wrapper .dataTables_paginate .paginate_button:active{outline:none;background-color:#0c0c0c;background:-webkit-gradient(linear, left top, left bottom, color-stop(0%, #2b2b2b), color-stop(100%, #0c0c0c));background:-webkit-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-moz-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-ms-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:-o-linear-gradient(top, #2b2b2b 0%, #0c0c0c 100%);background:linear-gradient(to bottom, #2b2b2b 0%, #0c0c0c 100%);box-shadow:inset 0 0 3px #111}.dataTables_wrapper .dataTables_paginate .ellipsis{padding:0 1em}.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter,.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_processing,.dataTables_wrapper .dataTables_paginate{color:inherit}.dataTables_wrapper .dataTables_scroll{clear:both}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody{-webkit-overflow-scrolling:touch}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>th,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>td,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>th,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>td{vertical-align:middle}.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>th>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>thead>tr>td>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>th>div.dataTables_sizing,.dataTables_wrapper .dataTables_scroll div.dataTables_scrollBody>table>tbody>tr>td>div.dataTables_sizing{height:0;overflow:hidden;margin:0 !important;padding:0 !important}.dataTables_wrapper.no-footer .dataTables_scrollBody{border-bottom:1px solid rgba(0, 0, 0, 0.3)}.dataTables_wrapper.no-footer div.dataTables_scrollHead table.dataTable,.dataTables_wrapper.no-footer div.dataTables_scrollBody>table{border-bottom:none}.dataTables_wrapper:after{visibility:hidden;display:block;content:"";clear:both;height:0}@media screen and (max-width: 767px){.dataTables_wrapper .dataTables_info,.dataTables_wrapper .dataTables_paginate{float:none;text-align:center}.dataTables_wrapper .dataTables_paginate{margin-top:.5em}}@media screen and (max-width: 640px){.dataTables_wrapper .dataTables_length,.dataTables_wrapper .dataTables_filter{float:none;text-align:center}.dataTables_wrapper .dataTables_filter{margin-top:.5em}}html.dark{--dt-row-hover: 255, 255, 255;--dt-row-stripe: 255, 255, 255;--dt-column-ordering: 255, 255, 255}html.dark table.dataTable>thead>tr>th,html.dark table.dataTable>thead>tr>td{border-bottom:1px solid rgb(89, 91, 94)}html.dark table.dataTable>thead>tr>th:active,html.dark table.dataTable>thead>tr>td:active{outline:none}html.dark table.dataTable>tfoot>tr>th,html.dark table.dataTable>tfoot>tr>td{border-top:1px solid rgb(89, 91, 94)}html.dark table.dataTable.row-border>tbody>tr>th,html.dark table.dataTable.row-border>tbody>tr>td,html.dark table.dataTable.display>tbody>tr>th,html.dark table.dataTable.display>tbody>tr>td{border-top:1px solid rgb(64, 67, 70)}html.dark table.dataTable.row-border>tbody>tr.selected+tr.selected>td,html.dark table.dataTable.display>tbody>tr.selected+tr.selected>td{border-top-color:#0257d5}html.dark table.dataTable.cell-border>tbody>tr>th,html.dark table.dataTable.cell-border>tbody>tr>td{border-top:1px solid rgb(64, 67, 70);border-right:1px solid rgb(64, 67, 70)}html.dark table.dataTable.cell-border>tbody>tr>th:first-child,html.dark table.dataTable.cell-border>tbody>tr>td:first-child{border-left:1px solid rgb(64, 67, 70)}html.dark .dataTables_wrapper .dataTables_filter input,html.dark .dataTables_wrapper .dataTables_length select{border:1px solid rgba(255, 255, 255, 0.2);background-color:var(--dt-html-background)}html.dark .dataTables_wrapper .dataTables_paginate .paginate_button.current,html.dark .dataTables_wrapper .dataTables_paginate .paginate_button.current:hover{border:1px solid rgb(89, 91, 94);background:rgba(255, 255, 255, 0.15)}html.dark .dataTables_wrapper .dataTables_paginate .paginate_button.disabled,html.dark .dataTables_wrapper .dataTables_paginate .paginate_button.disabled:hover,html.dark .dataTables_wrapper .dataTables_paginate .paginate_button.disabled:active{color:#666 !important}html.dark .dataTables_wrapper .dataTables_paginate .paginate_button:hover{border:1px solid rgb(53, 53, 53);background:rgb(53, 53, 53)}html.dark .dataTables_wrapper .dataTables_paginate .paginate_button:active{background:#3a3a3a} diff --git a/intro/intro02_es/libs/dt-core/js/jquery.dataTables.min.js b/intro/intro02_es/libs/dt-core/js/jquery.dataTables.min.js index c89263c..f786b0d 100644 --- a/intro/intro02_es/libs/dt-core/js/jquery.dataTables.min.js +++ b/intro/intro02_es/libs/dt-core/js/jquery.dataTables.min.js @@ -1,4 +1,4 @@ -/*! DataTables 1.13.4 +/*! DataTables 1.13.6 * ©2008-2023 SpryMedia Ltd - datatables.net/license */ -!function(n){"use strict";var a;"function"==typeof define&&define.amd?define(["jquery"],function(t){return n(t,window,document)}):"object"==typeof exports?(a=require("jquery"),"undefined"!=typeof window?module.exports=function(t,e){return t=t||window,e=e||a(t),n(e,t,t.document)}:n(a,window,window.document)):window.DataTable=n(jQuery,window,document)}(function(P,j,y,N){"use strict";function d(t){var e=parseInt(t,10);return!isNaN(e)&&isFinite(t)?e:null}function l(t,e,n){var a=typeof t,r="string"==a;return"number"==a||"bigint"==a||!!h(t)||(e&&r&&(t=G(t,e)),n&&r&&(t=t.replace(q,"")),!isNaN(parseFloat(t))&&isFinite(t))}function a(t,e,n){var a;return!!h(t)||(h(a=t)||"string"==typeof a)&&!!l(t.replace(V,""),e,n)||null}function m(t,e,n,a){var r=[],o=0,i=e.length;if(a!==N)for(;o").appendTo(l)),h.nTHead=n[0],l.children("tbody")),n=(0===a.length&&(a=P("").insertAfter(n)),h.nTBody=a[0],l.children("tfoot"));if(0===(n=0===n.length&&0").appendTo(l):n).length||0===n.children().length?l.addClass(p.sNoFooter):0/g,X=/^\d{2,4}[\.\/\-]\d{1,2}[\.\/\-]\d{1,2}([T ]{1}\d{1,2}[:\.]\d{2}([\.:]\d{2})?)?$/,J=new RegExp("(\\"+["/",".","*","+","?","|","(",")","[","]","{","}","\\","$","^","-"].join("|\\")+")","g"),q=/['\u00A0,$£€¥%\u2009\u202F\u20BD\u20a9\u20BArfkɃΞ]/gi,h=function(t){return!t||!0===t||"-"===t},G=function(t,e){return c[e]||(c[e]=new RegExp(Ot(e),"g")),"string"==typeof t&&"."!==e?t.replace(/\./g,"").replace(c[e],"."):t},H=function(t,e,n){var a=[],r=0,o=t.length;if(n!==N)for(;r").css({position:"fixed",top:0,left:-1*P(j).scrollLeft(),height:1,width:1,overflow:"hidden"}).append(P("
").css({position:"absolute",top:1,left:1,width:100,overflow:"scroll"}).append(P("
").css({width:"100%",height:10}))).appendTo("body")).children()).children(),e.barWidth=a[0].offsetWidth-a[0].clientWidth,e.bScrollOversize=100===r[0].offsetWidth&&100!==a[0].clientWidth,e.bScrollbarLeft=1!==Math.round(r.offset().left),e.bBounding=!!n[0].getBoundingClientRect().width,n.remove()),P.extend(t.oBrowser,w.__browser),t.oScroll.iBarWidth=w.__browser.barWidth}function et(t,e,n,a,r,o){var i,l=a,s=!1;for(n!==N&&(i=n,s=!0);l!==r;)t.hasOwnProperty(l)&&(i=s?e(i,t[l],l,t):t[l],s=!0,l+=o);return i}function nt(t,e){var n=w.defaults.column,a=t.aoColumns.length,n=P.extend({},w.models.oColumn,n,{nTh:e||y.createElement("th"),sTitle:n.sTitle||(e?e.innerHTML:""),aDataSort:n.aDataSort||[a],mData:n.mData||a,idx:a}),n=(t.aoColumns.push(n),t.aoPreSearchCols);n[a]=P.extend({},w.models.oSearch,n[a]),at(t,a,P(e).data())}function at(t,e,n){function a(t){return"string"==typeof t&&-1!==t.indexOf("@")}var e=t.aoColumns[e],r=t.oClasses,o=P(e.nTh),i=(!e.sWidthOrig&&(e.sWidthOrig=o.attr("width")||null,u=(o.attr("style")||"").match(/width:\s*(\d+[pxem%]+)/))&&(e.sWidthOrig=u[1]),n!==N&&null!==n&&(Q(n),C(w.defaults.column,n,!0),n.mDataProp===N||n.mData||(n.mData=n.mDataProp),n.sType&&(e._sManualType=n.sType),n.className&&!n.sClass&&(n.sClass=n.className),n.sClass&&o.addClass(n.sClass),u=e.sClass,P.extend(e,n),F(e,n,"sWidth","sWidthOrig"),u!==e.sClass&&(e.sClass=u+" "+e.sClass),n.iDataSort!==N&&(e.aDataSort=[n.iDataSort]),F(e,n,"aDataSort")),e.mData),l=A(i),s=e.mRender?A(e.mRender):null,u=(e._bAttrSrc=P.isPlainObject(i)&&(a(i.sort)||a(i.type)||a(i.filter)),e._setter=null,e.fnGetData=function(t,e,n){var a=l(t,e,N,n);return s&&e?s(a,e,t,n):a},e.fnSetData=function(t,e,n){return b(i)(t,e,n)},"number"==typeof i||e._isArrayHost||(t._rowReadObject=!0),t.oFeatures.bSort||(e.bSortable=!1,o.addClass(r.sSortableNone)),-1!==P.inArray("asc",e.asSorting)),n=-1!==P.inArray("desc",e.asSorting);e.bSortable&&(u||n)?u&&!n?(e.sSortingClass=r.sSortableAsc,e.sSortingClassJUI=r.sSortJUIAscAllowed):!u&&n?(e.sSortingClass=r.sSortableDesc,e.sSortingClassJUI=r.sSortJUIDescAllowed):(e.sSortingClass=r.sSortable,e.sSortingClassJUI=r.sSortJUI):(e.sSortingClass=r.sSortableNone,e.sSortingClassJUI="")}function O(t){if(!1!==t.oFeatures.bAutoWidth){var e=t.aoColumns;ee(t);for(var n=0,a=e.length;ne&&t[r]--;-1!=a&&n===N&&t.splice(a,1)}function bt(n,a,t,e){function r(t,e){for(;t.childNodes.length;)t.removeChild(t.firstChild);t.innerHTML=S(n,a,e,"display")}var o,i,l=n.aoData[a];if("dom"!==t&&(t&&"auto"!==t||"dom"!==l.src)){var s=l.anCells;if(s)if(e!==N)r(s[e],e);else for(o=0,i=s.length;o").appendTo(r)),c=0,f=s.length;c=s.fnRecordsDisplay()?0:l,s.iInitDisplayStart=-1);var n=R(t,"aoPreDrawCallback","preDraw",[t]);if(-1!==P.inArray(!1,n))D(t,!1);else{var a=[],r=0,o=t.asStripeClasses,i=o.length,l=t.oLanguage,s="ssp"==E(t),u=t.aiDisplay,n=t._iDisplayStart,c=t.fnDisplayEnd();if(t.bDrawing=!0,t.bDeferLoading)t.bDeferLoading=!1,t.iDraw++,D(t,!1);else if(s){if(!t.bDestroying&&!e)return void xt(t)}else t.iDraw++;if(0!==u.length)for(var f=s?t.aoData.length:c,d=s?0:n;d",{class:i?o[0]:""}).append(P("",{valign:"top",colSpan:T(t),class:t.oClasses.sRowEmpty}).html(e))[0]}R(t,"aoHeaderCallback","header",[P(t.nTHead).children("tr")[0],ht(t),n,c,u]),R(t,"aoFooterCallback","footer",[P(t.nTFoot).children("tr")[0],ht(t),n,c,u]);s=P(t.nTBody);s.children().detach(),s.append(P(a)),R(t,"aoDrawCallback","draw",[t]),t.bSorted=!1,t.bFiltered=!1,t.bDrawing=!1}}function u(t,e){var n=t.oFeatures,a=n.bSort,n=n.bFilter;a&&ie(t),n?Rt(t,t.oPreviousSearch):t.aiDisplay=t.aiDisplayMaster.slice(),!0!==e&&(t._iDisplayStart=0),t._drawHold=e,v(t),t._drawHold=!1}function _t(t){for(var e,n,a,r,o,i,l,s=t.oClasses,u=P(t.nTable),u=P("
").insertBefore(u),c=t.oFeatures,f=P("
",{id:t.sTableId+"_wrapper",class:s.sWrapper+(t.nTFoot?"":" "+s.sNoFooter)}),d=(t.nHolding=u[0],t.nTableWrapper=f[0],t.nTableReinsertBefore=t.nTable.nextSibling,t.sDom.split("")),h=0;h")[0],"'"==(r=d[h+1])||'"'==r){for(o="",i=2;d[h+i]!=r;)o+=d[h+i],i++;"H"==o?o=s.sJUIHeader:"F"==o&&(o=s.sJUIFooter),-1!=o.indexOf(".")?(l=o.split("."),a.id=l[0].substr(1,l[0].length-1),a.className=l[1]):"#"==o.charAt(0)?a.id=o.substr(1,o.length-1):a.className=o,h+=i}f.append(a),f=P(a)}else if(">"==n)f=f.parent();else if("l"==n&&c.bPaginate&&c.bLengthChange)e=$t(t);else if("f"==n&&c.bFilter)e=Lt(t);else if("r"==n&&c.bProcessing)e=Zt(t);else if("t"==n)e=Kt(t);else if("i"==n&&c.bInfo)e=Ut(t);else if("p"==n&&c.bPaginate)e=zt(t);else if(0!==w.ext.feature.length)for(var p=w.ext.feature,g=0,b=p.length;g',s=(s=r.sSearch).match(/_INPUT_/)?s.replace("_INPUT_",l):s+l,l=P("
",{id:i.f?null:a+"_filter",class:t.sFilter}).append(P("
").addClass(t.sLength);return a.aanFeatures.l||(c[0].id=e+"_length"),c.children().append(a.oLanguage.sLengthMenu.replace("_MENU_",l[0].outerHTML)),P("select",c).val(a._iDisplayLength).on("change.DT",function(t){Gt(a,P(this).val()),v(a)}),P(a.nTable).on("length.dt.DT",function(t,e,n){a===e&&P("select",c).val(n)}),c[0]}function zt(t){function c(t){v(t)}var e=t.sPaginationType,f=w.ext.pager[e],d="function"==typeof f,e=P("
").addClass(t.oClasses.sPaging+e)[0],h=t.aanFeatures;return d||f.fnInit(t,e,c),h.p||(e.id=t.sTableId+"_paginate",t.aoDrawCallback.push({fn:function(t){if(d)for(var e=t._iDisplayStart,n=t._iDisplayLength,a=t.fnRecordsDisplay(),r=-1===n,o=r?0:Math.ceil(e/n),i=r?1:Math.ceil(a/n),l=f(o,i),s=0,u=h.p.length;s",{id:t.aanFeatures.r?null:t.sTableId+"_processing",class:t.oClasses.sProcessing,role:"status"}).html(t.oLanguage.sProcessing).append("
").insertBefore(t.nTable)[0]}function D(t,e){t.oFeatures.bProcessing&&P(t.aanFeatures.r).css("display",e?"block":"none"),R(t,null,"processing",[t,e])}function Kt(t){var e,n,a,r,o,i,l,s,u,c,f,d,h=P(t.nTable),p=t.oScroll;return""===p.sX&&""===p.sY?t.nTable:(e=p.sX,n=p.sY,a=t.oClasses,o=(r=h.children("caption")).length?r[0]._captionSide:null,s=P(h[0].cloneNode(!1)),i=P(h[0].cloneNode(!1)),u=function(t){return t?M(t):null},(l=h.children("tfoot")).length||(l=null),s=P(f="
",{class:a.sScrollWrapper}).append(P(f,{class:a.sScrollHead}).css({overflow:"hidden",position:"relative",border:0,width:e?u(e):"100%"}).append(P(f,{class:a.sScrollHeadInner}).css({"box-sizing":"content-box",width:p.sXInner||"100%"}).append(s.removeAttr("id").css("margin-left",0).append("top"===o?r:null).append(h.children("thead"))))).append(P(f,{class:a.sScrollBody}).css({position:"relative",overflow:"auto",width:u(e)}).append(h)),l&&s.append(P(f,{class:a.sScrollFoot}).css({overflow:"hidden",border:0,width:e?u(e):"100%"}).append(P(f,{class:a.sScrollFootInner}).append(i.removeAttr("id").css("margin-left",0).append("bottom"===o?r:null).append(h.children("tfoot"))))),u=s.children(),c=u[0],f=u[1],d=l?u[2]:null,e&&P(f).on("scroll.DT",function(t){var e=this.scrollLeft;c.scrollLeft=e,l&&(d.scrollLeft=e)}),P(f).css("max-height",n),p.bCollapse||P(f).css("height",n),t.nScrollHead=c,t.nScrollBody=f,t.nScrollFoot=d,t.aoDrawCallback.push({fn:Qt,sName:"scrolling"}),s[0])}function Qt(n){function t(t){(t=t.style).paddingTop="0",t.paddingBottom="0",t.borderTopWidth="0",t.borderBottomWidth="0",t.height=0}var e,a,r,o,i,l=n.oScroll,s=l.sX,u=l.sXInner,c=l.sY,l=l.iBarWidth,f=P(n.nScrollHead),d=f[0].style,h=f.children("div"),p=h[0].style,h=h.children("table"),g=n.nScrollBody,b=P(g),m=g.style,S=P(n.nScrollFoot).children("div"),v=S.children("table"),y=P(n.nTHead),D=P(n.nTable),_=D[0],w=_.style,C=n.nTFoot?P(n.nTFoot):null,T=n.oBrowser,x=T.bScrollOversize,A=(H(n.aoColumns,"nTh"),[]),I=[],F=[],L=[],R=g.scrollHeight>g.clientHeight;n.scrollBarVis!==R&&n.scrollBarVis!==N?(n.scrollBarVis=R,O(n)):(n.scrollBarVis=R,D.children("thead, tfoot").remove(),C&&(R=C.clone().prependTo(D),i=C.find("tr"),a=R.find("tr"),R.find("[id]").removeAttr("id")),R=y.clone().prependTo(D),y=y.find("tr"),e=R.find("tr"),R.find("th, td").removeAttr("tabindex"),R.find("[id]").removeAttr("id"),s||(m.width="100%",f[0].style.width="100%"),P.each(Ct(n,R),function(t,e){r=rt(n,t),e.style.width=n.aoColumns[r].sWidth}),C&&k(function(t){t.style.width=""},a),f=D.outerWidth(),""===s?(w.width="100%",x&&(D.find("tbody").height()>g.offsetHeight||"scroll"==b.css("overflow-y"))&&(w.width=M(D.outerWidth()-l)),f=D.outerWidth()):""!==u&&(w.width=M(u),f=D.outerWidth()),k(t,e),k(function(t){var e=j.getComputedStyle?j.getComputedStyle(t).width:M(P(t).width());F.push(t.innerHTML),A.push(e)},e),k(function(t,e){t.style.width=A[e]},y),P(e).css("height",0),C&&(k(t,a),k(function(t){L.push(t.innerHTML),I.push(M(P(t).css("width")))},a),k(function(t,e){t.style.width=I[e]},i),P(a).height(0)),k(function(t,e){t.innerHTML='
'+F[e]+"
",t.childNodes[0].style.height="0",t.childNodes[0].style.overflow="hidden",t.style.width=A[e]},e),C&&k(function(t,e){t.innerHTML='
'+L[e]+"
",t.childNodes[0].style.height="0",t.childNodes[0].style.overflow="hidden",t.style.width=I[e]},a),Math.round(D.outerWidth())g.offsetHeight||"scroll"==b.css("overflow-y")?f+l:f,x&&(g.scrollHeight>g.offsetHeight||"scroll"==b.css("overflow-y"))&&(w.width=M(o-l)),""!==s&&""===u||W(n,1,"Possible column misalignment",6)):o="100%",m.width=M(o),d.width=M(o),C&&(n.nScrollFoot.style.width=M(o)),c||x&&(m.height=M(_.offsetHeight+l)),R=D.outerWidth(),h[0].style.width=M(R),p.width=M(R),y=D.height()>g.clientHeight||"scroll"==b.css("overflow-y"),p[i="padding"+(T.bScrollbarLeft?"Left":"Right")]=y?l+"px":"0px",C&&(v[0].style.width=M(R),S[0].style.width=M(R),S[0].style[i]=y?l+"px":"0px"),D.children("colgroup").insertBefore(D.children("thead")),b.trigger("scroll"),!n.bSorted&&!n.bFiltered||n._drawHold||(g.scrollTop=0))}function k(t,e,n){for(var a,r,o=0,i=0,l=e.length;i/g;function ee(t){var e,n,a=t.nTable,r=t.aoColumns,o=t.oScroll,i=o.sY,l=o.sX,o=o.sXInner,s=r.length,u=it(t,"bVisible"),c=P("th",t.nTHead),f=a.getAttribute("width"),d=a.parentNode,h=!1,p=t.oBrowser,g=p.bScrollOversize,b=a.style.width;for(b&&-1!==b.indexOf("%")&&(f=b),D=0;D").appendTo(b.find("tbody")));for(b.find("thead, tfoot").remove(),b.append(P(t.nTHead).clone()).append(P(t.nTFoot).clone()),b.find("tfoot th, tfoot td").css("width",""),c=Ct(t,b.find("thead")[0]),D=0;D").css({width:e.sWidthOrig,margin:0,padding:0,border:0,height:1}));if(t.aoData.length)for(D=0;D").css(l||i?{position:"absolute",top:0,left:0,height:1,right:0,overflow:"hidden"}:{}).append(b).appendTo(d),y=(l&&o?b.width(o):l?(b.css("width","auto"),b.removeAttr("width"),b.width()").css("width",M(t)).appendTo(e||y.body))[0].offsetWidth,t.remove(),e):0}function re(t,e){var n,a=oe(t,e);return a<0?null:(n=t.aoData[a]).nTr?n.anCells[e]:P("").html(S(t,a,e,"display"))[0]}function oe(t,e){for(var n,a=-1,r=-1,o=0,i=t.aoData.length;oa&&(a=n.length,r=o);return r}function M(t){return null===t?"0px":"number"==typeof t?t<0?"0px":t+"px":t.match(/\d$/)?t+"px":t}function I(t){function e(t){t.length&&!Array.isArray(t[0])?h.push(t):P.merge(h,t)}var n,a,r,o,i,l,s,u=[],c=t.aoColumns,f=t.aaSortingFixed,d=P.isPlainObject(f),h=[];for(Array.isArray(f)&&e(f),d&&f.pre&&e(f.pre),e(t.aaSorting),d&&f.post&&e(f.post),n=0;n/g,""),u=i.nTh;u.removeAttribute("aria-sort"),i=i.bSortable?s+("asc"===(0=o.length?[0,e[1]]:e)})),t.search!==N&&P.extend(n.oPreviousSearch,Bt(t.search)),t.columns){for(a=0,r=t.columns.length;a").addClass(e),P("td",n).addClass(e).html(t)[0].colSpan=T(o),l.push(n[0]))}var l=[];i(e,n),t._details&&t._details.detach(),t._details=P(l),t._detailsShow&&t._details.insertAfter(t.nTr)}function xe(t,e){var n=t.context;if(n.length&&t.length){var a=n[0].aoData[t[0]];if(a._details){(a._detailsShow=e)?(a._details.insertAfter(a.nTr),P(a.nTr).addClass("dt-hasChild")):(a._details.detach(),P(a.nTr).removeClass("dt-hasChild")),R(n[0],null,"childRow",[e,t.row(t[0])]);var s=n[0],r=new B(s),a=".dt.DT_details",e="draw"+a,t="column-sizing"+a,a="destroy"+a,u=s.aoData;if(r.off(e+" "+t+" "+a),H(u,"_details").length>0){r.on(e,function(t,e){if(s!==e)return;r.rows({page:"current"}).eq(0).each(function(t){var e=u[t];if(e._detailsShow)e._details.insertAfter(e.nTr)})});r.on(t,function(t,e,n,a){if(s!==e)return;var r,o=T(e);for(var i=0,l=u.length;it?new B(e[t],this[t]):null},filter:function(t){var e=[];if(o.filter)e=o.filter.call(this,t,this);else for(var n=0,a=this.length;n").appendTo(t);p(u,n)}else{switch(g=null,b=n,a=c.iTabIndex,n){case"ellipsis":t.append('');break;case"first":g=S.sFirst,0===d&&(a=-1,b+=" "+o);break;case"previous":g=S.sPrevious,0===d&&(a=-1,b+=" "+o);break;case"next":g=S.sNext,0!==h&&d!==h-1||(a=-1,b+=" "+o);break;case"last":g=S.sLast,0!==h&&d!==h-1||(a=-1,b+=" "+o);break;default:g=c.fnFormatNumber(n+1),b=d===n?m.sPageButtonActive:""}null!==g&&(u=c.oInit.pagingTag||"a",r=-1!==b.indexOf(o),me(P("<"+u+">",{class:m.sPageButton+" "+b,"aria-controls":c.sTableId,"aria-disabled":r?"true":null,"aria-label":v[n],"aria-role":"link","aria-current":b===m.sPageButtonActive?"page":null,"data-dt-idx":n,tabindex:a,id:0===f&&"string"==typeof n?c.sTableId+"_"+n:null}).html(g).appendTo(t),{action:n},i))}}var g,b,n,m=c.oClasses,S=c.oLanguage.oPaginate,v=c.oLanguage.oAria.paginate||{};try{n=P(t).find(y.activeElement).data("dt-idx")}catch(t){}p(P(t).empty(),e),n!==N&&P(t).find("[data-dt-idx="+n+"]").trigger("focus")}}}),P.extend(w.ext.type.detect,[function(t,e){e=e.oLanguage.sDecimal;return l(t,e)?"num"+e:null},function(t,e){var n;return(!t||t instanceof Date||X.test(t))&&(null!==(n=Date.parse(t))&&!isNaN(n)||h(t))?"date":null},function(t,e){e=e.oLanguage.sDecimal;return l(t,e,!0)?"num-fmt"+e:null},function(t,e){e=e.oLanguage.sDecimal;return a(t,e)?"html-num"+e:null},function(t,e){e=e.oLanguage.sDecimal;return a(t,e,!0)?"html-num-fmt"+e:null},function(t,e){return h(t)||"string"==typeof t&&-1!==t.indexOf("<")?"html":null}]),P.extend(w.ext.type.search,{html:function(t){return h(t)?t:"string"==typeof t?t.replace(U," ").replace(V,""):""},string:function(t){return!h(t)&&"string"==typeof t?t.replace(U," "):t}});function ke(t,e,n,a){var r;return 0===t||t&&"-"!==t?"number"==(r=typeof t)||"bigint"==r?t:+(t=(t=e?G(t,e):t).replace&&(n&&(t=t.replace(n,"")),a)?t.replace(a,""):t):-1/0}function Me(n){P.each({num:function(t){return ke(t,n)},"num-fmt":function(t){return ke(t,n,q)},"html-num":function(t){return ke(t,n,V)},"html-num-fmt":function(t){return ke(t,n,V,q)}},function(t,e){p.type.order[t+n+"-pre"]=e,t.match(/^html\-/)&&(p.type.search[t+n]=p.type.search.html)})}P.extend(p.type.order,{"date-pre":function(t){t=Date.parse(t);return isNaN(t)?-1/0:t},"html-pre":function(t){return h(t)?"":t.replace?t.replace(/<.*?>/g,"").toLowerCase():t+""},"string-pre":function(t){return h(t)?"":"string"==typeof t?t.toLowerCase():t.toString?t.toString():""},"string-asc":function(t,e){return t").addClass(l.sSortJUIWrapper).append(o.contents()).append(P("").addClass(l.sSortIcon+" "+i.sSortingClassJUI)).appendTo(o),P(r.nTable).on("order.dt.DT",function(t,e,n,a){r===e&&(e=i.idx,o.removeClass(l.sSortAsc+" "+l.sSortDesc).addClass("asc"==a[e]?l.sSortAsc:"desc"==a[e]?l.sSortDesc:i.sSortingClass),o.find("span."+l.sSortIcon).removeClass(l.sSortJUIAsc+" "+l.sSortJUIDesc+" "+l.sSortJUI+" "+l.sSortJUIAscAllowed+" "+l.sSortJUIDescAllowed).addClass("asc"==a[e]?l.sSortJUIAsc:"desc"==a[e]?l.sSortJUIDesc:i.sSortingClassJUI))})}}});function We(t){return"string"==typeof(t=Array.isArray(t)?t.join(","):t)?t.replace(/&/g,"&").replace(//g,">").replace(/"/g,"""):t}function Ee(t,e,n,a,r){return j.moment?t[e](r):j.luxon?t[n](r):a?t[a](r):t}var Be=!1;function Ue(t,e,n){var a;if(j.moment){if(!(a=j.moment.utc(t,e,n,!0)).isValid())return null}else if(j.luxon){if(!(a=e&&"string"==typeof t?j.luxon.DateTime.fromFormat(t,e):j.luxon.DateTime.fromISO(t)).isValid)return null;a.setLocale(n)}else e?(Be||alert("DataTables warning: Formatted date without Moment.js or Luxon - https://datatables.net/tn/17"),Be=!0):a=new Date(t);return a}function Ve(s){return function(a,r,o,i){0===arguments.length?(o="en",a=r=null):1===arguments.length?(o="en",r=a,a=null):2===arguments.length&&(o=r,r=a,a=null);var l="datetime-"+r;return w.ext.type.order[l]||(w.ext.type.detect.unshift(function(t){return t===l&&l}),w.ext.type.order[l+"-asc"]=function(t,e){t=t.valueOf(),e=e.valueOf();return t===e?0:t").appendTo(l)),h.nTHead=n[0],l.children("tbody")),n=(0===a.length&&(a=P("").insertAfter(n)),h.nTBody=a[0],l.children("tfoot"));if(0===(n=0===n.length&&0").appendTo(l):n).length||0===n.children().length?l.addClass(p.sNoFooter):0/g,X=/^\d{2,4}[\.\/\-]\d{1,2}[\.\/\-]\d{1,2}([T ]{1}\d{1,2}[:\.]\d{2}([\.:]\d{2})?)?$/,J=new RegExp("(\\"+["/",".","*","+","?","|","(",")","[","]","{","}","\\","$","^","-"].join("|\\")+")","g"),q=/['\u00A0,$£€¥%\u2009\u202F\u20BD\u20a9\u20BArfkɃΞ]/gi,h=function(t){return!t||!0===t||"-"===t},$=function(t,e){return c[e]||(c[e]=new RegExp(Ot(e),"g")),"string"==typeof t&&"."!==e?t.replace(/\./g,"").replace(c[e],"."):t},N=function(t,e,n){var a=[],r=0,o=t.length;if(n!==H)for(;r").css({position:"fixed",top:0,left:-1*P(j).scrollLeft(),height:1,width:1,overflow:"hidden"}).append(P("
").css({position:"absolute",top:1,left:1,width:100,overflow:"scroll"}).append(P("
").css({width:"100%",height:10}))).appendTo("body")).children()).children(),e.barWidth=a[0].offsetWidth-a[0].clientWidth,e.bScrollOversize=100===r[0].offsetWidth&&100!==a[0].clientWidth,e.bScrollbarLeft=1!==Math.round(r.offset().left),e.bBounding=!!n[0].getBoundingClientRect().width,n.remove()),P.extend(t.oBrowser,w.__browser),t.oScroll.iBarWidth=w.__browser.barWidth}function et(t,e,n,a,r,o){var i,l=a,s=!1;for(n!==H&&(i=n,s=!0);l!==r;)t.hasOwnProperty(l)&&(i=s?e(i,t[l],l,t):t[l],s=!0,l+=o);return i}function nt(t,e){var n=w.defaults.column,a=t.aoColumns.length,n=P.extend({},w.models.oColumn,n,{nTh:e||v.createElement("th"),sTitle:n.sTitle||(e?e.innerHTML:""),aDataSort:n.aDataSort||[a],mData:n.mData||a,idx:a}),n=(t.aoColumns.push(n),t.aoPreSearchCols);n[a]=P.extend({},w.models.oSearch,n[a]),at(t,a,P(e).data())}function at(t,e,n){function a(t){return"string"==typeof t&&-1!==t.indexOf("@")}var e=t.aoColumns[e],r=t.oClasses,o=P(e.nTh),i=(!e.sWidthOrig&&(e.sWidthOrig=o.attr("width")||null,u=(o.attr("style")||"").match(/width:\s*(\d+[pxem%]+)/))&&(e.sWidthOrig=u[1]),n!==H&&null!==n&&(Q(n),C(w.defaults.column,n,!0),n.mDataProp===H||n.mData||(n.mData=n.mDataProp),n.sType&&(e._sManualType=n.sType),n.className&&!n.sClass&&(n.sClass=n.className),n.sClass&&o.addClass(n.sClass),u=e.sClass,P.extend(e,n),F(e,n,"sWidth","sWidthOrig"),u!==e.sClass&&(e.sClass=u+" "+e.sClass),n.iDataSort!==H&&(e.aDataSort=[n.iDataSort]),F(e,n,"aDataSort"),e.ariaTitle||(e.ariaTitle=o.attr("aria-label"))),e.mData),l=A(i),s=e.mRender?A(e.mRender):null,u=(e._bAttrSrc=P.isPlainObject(i)&&(a(i.sort)||a(i.type)||a(i.filter)),e._setter=null,e.fnGetData=function(t,e,n){var a=l(t,e,H,n);return s&&e?s(a,e,t,n):a},e.fnSetData=function(t,e,n){return b(i)(t,e,n)},"number"==typeof i||e._isArrayHost||(t._rowReadObject=!0),t.oFeatures.bSort||(e.bSortable=!1,o.addClass(r.sSortableNone)),-1!==P.inArray("asc",e.asSorting)),n=-1!==P.inArray("desc",e.asSorting);e.bSortable&&(u||n)?u&&!n?(e.sSortingClass=r.sSortableAsc,e.sSortingClassJUI=r.sSortJUIAscAllowed):!u&&n?(e.sSortingClass=r.sSortableDesc,e.sSortingClassJUI=r.sSortJUIDescAllowed):(e.sSortingClass=r.sSortable,e.sSortingClassJUI=r.sSortJUI):(e.sSortingClass=r.sSortableNone,e.sSortingClassJUI="")}function O(t){if(!1!==t.oFeatures.bAutoWidth){var e=t.aoColumns;ee(t);for(var n=0,a=e.length;ne&&t[r]--;-1!=a&&n===H&&t.splice(a,1)}function bt(n,a,t,e){function r(t,e){for(;t.childNodes.length;)t.removeChild(t.firstChild);t.innerHTML=S(n,a,e,"display")}var o,i,l=n.aoData[a];if("dom"!==t&&(t&&"auto"!==t||"dom"!==l.src)){var s=l.anCells;if(s)if(e!==H)r(s[e],e);else for(o=0,i=s.length;o").appendTo(r)),c=0,f=s.length;c=s.fnRecordsDisplay()?0:l,s.iInitDisplayStart=-1);var n=R(t,"aoPreDrawCallback","preDraw",[t]);if(-1!==P.inArray(!1,n))D(t,!1);else{var a=[],r=0,o=t.asStripeClasses,i=o.length,l=t.oLanguage,s="ssp"==E(t),u=t.aiDisplay,n=t._iDisplayStart,c=t.fnDisplayEnd();if(t.bDrawing=!0,t.bDeferLoading)t.bDeferLoading=!1,t.iDraw++,D(t,!1);else if(s){if(!t.bDestroying&&!e)return void xt(t)}else t.iDraw++;if(0!==u.length)for(var f=s?t.aoData.length:c,d=s?0:n;d",{class:i?o[0]:""}).append(P("",{valign:"top",colSpan:T(t),class:t.oClasses.sRowEmpty}).html(e))[0]}R(t,"aoHeaderCallback","header",[P(t.nTHead).children("tr")[0],ht(t),n,c,u]),R(t,"aoFooterCallback","footer",[P(t.nTFoot).children("tr")[0],ht(t),n,c,u]);s=P(t.nTBody);s.children().detach(),s.append(P(a)),R(t,"aoDrawCallback","draw",[t]),t.bSorted=!1,t.bFiltered=!1,t.bDrawing=!1}}function u(t,e){var n=t.oFeatures,a=n.bSort,n=n.bFilter;a&&ie(t),n?Rt(t,t.oPreviousSearch):t.aiDisplay=t.aiDisplayMaster.slice(),!0!==e&&(t._iDisplayStart=0),t._drawHold=e,y(t),t._drawHold=!1}function _t(t){for(var e,n,a,r,o,i,l,s=t.oClasses,u=P(t.nTable),u=P("
").insertBefore(u),c=t.oFeatures,f=P("
",{id:t.sTableId+"_wrapper",class:s.sWrapper+(t.nTFoot?"":" "+s.sNoFooter)}),d=(t.nHolding=u[0],t.nTableWrapper=f[0],t.nTableReinsertBefore=t.nTable.nextSibling,t.sDom.split("")),h=0;h")[0],"'"==(r=d[h+1])||'"'==r){for(o="",i=2;d[h+i]!=r;)o+=d[h+i],i++;"H"==o?o=s.sJUIHeader:"F"==o&&(o=s.sJUIFooter),-1!=o.indexOf(".")?(l=o.split("."),a.id=l[0].substr(1,l[0].length-1),a.className=l[1]):"#"==o.charAt(0)?a.id=o.substr(1,o.length-1):a.className=o,h+=i}f.append(a),f=P(a)}else if(">"==n)f=f.parent();else if("l"==n&&c.bPaginate&&c.bLengthChange)e=Gt(t);else if("f"==n&&c.bFilter)e=Lt(t);else if("r"==n&&c.bProcessing)e=Zt(t);else if("t"==n)e=Kt(t);else if("i"==n&&c.bInfo)e=Ut(t);else if("p"==n&&c.bPaginate)e=zt(t);else if(0!==w.ext.feature.length)for(var p=w.ext.feature,g=0,b=p.length;g',s=(s=r.sSearch).match(/_INPUT_/)?s.replace("_INPUT_",l):s+l,l=P("
",{id:i.f?null:a+"_filter",class:t.sFilter}).append(P("
").addClass(t.sLength);return a.aanFeatures.l||(c[0].id=e+"_length"),c.children().append(a.oLanguage.sLengthMenu.replace("_MENU_",l[0].outerHTML)),P("select",c).val(a._iDisplayLength).on("change.DT",function(t){$t(a,P(this).val()),y(a)}),P(a.nTable).on("length.dt.DT",function(t,e,n){a===e&&P("select",c).val(n)}),c[0]}function zt(t){function c(t){y(t)}var e=t.sPaginationType,f=w.ext.pager[e],d="function"==typeof f,e=P("
").addClass(t.oClasses.sPaging+e)[0],h=t.aanFeatures;return d||f.fnInit(t,e,c),h.p||(e.id=t.sTableId+"_paginate",t.aoDrawCallback.push({fn:function(t){if(d)for(var e=t._iDisplayStart,n=t._iDisplayLength,a=t.fnRecordsDisplay(),r=-1===n,o=r?0:Math.ceil(e/n),i=r?1:Math.ceil(a/n),l=f(o,i),s=0,u=h.p.length;s",{id:t.aanFeatures.r?null:t.sTableId+"_processing",class:t.oClasses.sProcessing,role:"status"}).html(t.oLanguage.sProcessing).append("
").insertBefore(t.nTable)[0]}function D(t,e){t.oFeatures.bProcessing&&P(t.aanFeatures.r).css("display",e?"block":"none"),R(t,null,"processing",[t,e])}function Kt(t){var e,n,a,r,o,i,l,s,u,c,f,d,h=P(t.nTable),p=t.oScroll;return""===p.sX&&""===p.sY?t.nTable:(e=p.sX,n=p.sY,a=t.oClasses,o=(r=h.children("caption")).length?r[0]._captionSide:null,s=P(h[0].cloneNode(!1)),i=P(h[0].cloneNode(!1)),u=function(t){return t?M(t):null},(l=h.children("tfoot")).length||(l=null),s=P(f="
",{class:a.sScrollWrapper}).append(P(f,{class:a.sScrollHead}).css({overflow:"hidden",position:"relative",border:0,width:e?u(e):"100%"}).append(P(f,{class:a.sScrollHeadInner}).css({"box-sizing":"content-box",width:p.sXInner||"100%"}).append(s.removeAttr("id").css("margin-left",0).append("top"===o?r:null).append(h.children("thead"))))).append(P(f,{class:a.sScrollBody}).css({position:"relative",overflow:"auto",width:u(e)}).append(h)),l&&s.append(P(f,{class:a.sScrollFoot}).css({overflow:"hidden",border:0,width:e?u(e):"100%"}).append(P(f,{class:a.sScrollFootInner}).append(i.removeAttr("id").css("margin-left",0).append("bottom"===o?r:null).append(h.children("tfoot"))))),u=s.children(),c=u[0],f=u[1],d=l?u[2]:null,e&&P(f).on("scroll.DT",function(t){var e=this.scrollLeft;c.scrollLeft=e,l&&(d.scrollLeft=e)}),P(f).css("max-height",n),p.bCollapse||P(f).css("height",n),t.nScrollHead=c,t.nScrollBody=f,t.nScrollFoot=d,t.aoDrawCallback.push({fn:Qt,sName:"scrolling"}),s[0])}function Qt(n){function t(t){(t=t.style).paddingTop="0",t.paddingBottom="0",t.borderTopWidth="0",t.borderBottomWidth="0",t.height=0}var e,a,r,o,i,l=n.oScroll,s=l.sX,u=l.sXInner,c=l.sY,l=l.iBarWidth,f=P(n.nScrollHead),d=f[0].style,h=f.children("div"),p=h[0].style,h=h.children("table"),g=n.nScrollBody,b=P(g),m=g.style,S=P(n.nScrollFoot).children("div"),v=S.children("table"),y=P(n.nTHead),D=P(n.nTable),_=D[0],w=_.style,C=n.nTFoot?P(n.nTFoot):null,T=n.oBrowser,x=T.bScrollOversize,A=(N(n.aoColumns,"nTh"),[]),I=[],F=[],L=[],R=g.scrollHeight>g.clientHeight;n.scrollBarVis!==R&&n.scrollBarVis!==H?(n.scrollBarVis=R,O(n)):(n.scrollBarVis=R,D.children("thead, tfoot").remove(),C&&(R=C.clone().prependTo(D),i=C.find("tr"),a=R.find("tr"),R.find("[id]").removeAttr("id")),R=y.clone().prependTo(D),y=y.find("tr"),e=R.find("tr"),R.find("th, td").removeAttr("tabindex"),R.find("[id]").removeAttr("id"),s||(m.width="100%",f[0].style.width="100%"),P.each(Ct(n,R),function(t,e){r=rt(n,t),e.style.width=n.aoColumns[r].sWidth}),C&&k(function(t){t.style.width=""},a),f=D.outerWidth(),""===s?(w.width="100%",x&&(D.find("tbody").height()>g.offsetHeight||"scroll"==b.css("overflow-y"))&&(w.width=M(D.outerWidth()-l)),f=D.outerWidth()):""!==u&&(w.width=M(u),f=D.outerWidth()),k(t,e),k(function(t){var e=j.getComputedStyle?j.getComputedStyle(t).width:M(P(t).width());F.push(t.innerHTML),A.push(e)},e),k(function(t,e){t.style.width=A[e]},y),P(e).css("height",0),C&&(k(t,a),k(function(t){L.push(t.innerHTML),I.push(M(P(t).css("width")))},a),k(function(t,e){t.style.width=I[e]},i),P(a).height(0)),k(function(t,e){t.innerHTML='
'+F[e]+"
",t.childNodes[0].style.height="0",t.childNodes[0].style.overflow="hidden",t.style.width=A[e]},e),C&&k(function(t,e){t.innerHTML='
'+L[e]+"
",t.childNodes[0].style.height="0",t.childNodes[0].style.overflow="hidden",t.style.width=I[e]},a),Math.round(D.outerWidth())g.offsetHeight||"scroll"==b.css("overflow-y")?f+l:f,x&&(g.scrollHeight>g.offsetHeight||"scroll"==b.css("overflow-y"))&&(w.width=M(o-l)),""!==s&&""===u||W(n,1,"Possible column misalignment",6)):o="100%",m.width=M(o),d.width=M(o),C&&(n.nScrollFoot.style.width=M(o)),c||x&&(m.height=M(_.offsetHeight+l)),R=D.outerWidth(),h[0].style.width=M(R),p.width=M(R),y=D.height()>g.clientHeight||"scroll"==b.css("overflow-y"),p[i="padding"+(T.bScrollbarLeft?"Left":"Right")]=y?l+"px":"0px",C&&(v[0].style.width=M(R),S[0].style.width=M(R),S[0].style[i]=y?l+"px":"0px"),D.children("colgroup").insertBefore(D.children("thead")),b.trigger("scroll"),!n.bSorted&&!n.bFiltered||n._drawHold||(g.scrollTop=0))}function k(t,e,n){for(var a,r,o=0,i=0,l=e.length;i/g;function ee(t){var e,n,a=t.nTable,r=t.aoColumns,o=t.oScroll,i=o.sY,l=o.sX,o=o.sXInner,s=r.length,u=it(t,"bVisible"),c=P("th",t.nTHead),f=a.getAttribute("width"),d=a.parentNode,h=!1,p=t.oBrowser,g=p.bScrollOversize,b=a.style.width;for(b&&-1!==b.indexOf("%")&&(f=b),D=0;D").appendTo(b.find("tbody")));for(b.find("thead, tfoot").remove(),b.append(P(t.nTHead).clone()).append(P(t.nTFoot).clone()),b.find("tfoot th, tfoot td").css("width",""),c=Ct(t,b.find("thead")[0]),D=0;D").css({width:e.sWidthOrig,margin:0,padding:0,border:0,height:1}));if(t.aoData.length)for(D=0;D").css(l||i?{position:"absolute",top:0,left:0,height:1,right:0,overflow:"hidden"}:{}).append(b).appendTo(d),y=(l&&o?b.width(o):l?(b.css("width","auto"),b.removeAttr("width"),b.width()").css("width",M(t)).appendTo(e||v.body))[0].offsetWidth,t.remove(),e):0}function re(t,e){var n,a=oe(t,e);return a<0?null:(n=t.aoData[a]).nTr?n.anCells[e]:P("").html(S(t,a,e,"display"))[0]}function oe(t,e){for(var n,a=-1,r=-1,o=0,i=t.aoData.length;oa&&(a=n.length,r=o);return r}function M(t){return null===t?"0px":"number"==typeof t?t<0?"0px":t+"px":t.match(/\d$/)?t+"px":t}function I(t){function e(t){t.length&&!Array.isArray(t[0])?h.push(t):P.merge(h,t)}var n,a,r,o,i,l,s,u=[],c=t.aoColumns,f=t.aaSortingFixed,d=P.isPlainObject(f),h=[];for(Array.isArray(f)&&e(f),d&&f.pre&&e(f.pre),e(t.aaSorting),d&&f.post&&e(f.post),n=0;n/g,""),u=i.nTh;u.removeAttribute("aria-sort"),i=i.bSortable?s+("asc"===(0=o.length?[0,e[1]]:e)})),t.search!==H&&P.extend(n.oPreviousSearch,Bt(t.search)),t.columns){for(a=0,r=t.columns.length;a").addClass(e),P("td",n).addClass(e).html(t)[0].colSpan=T(o),l.push(n[0]))}var l=[];i(e,n),t._details&&t._details.detach(),t._details=P(l),t._detailsShow&&t._details.insertAfter(t.nTr)}function xe(t,e){var n=t.context;if(n.length&&t.length){var a=n[0].aoData[t[0]];if(a._details){(a._detailsShow=e)?(a._details.insertAfter(a.nTr),P(a.nTr).addClass("dt-hasChild")):(a._details.detach(),P(a.nTr).removeClass("dt-hasChild")),R(n[0],null,"childRow",[e,t.row(t[0])]);var s=n[0],r=new B(s),a=".dt.DT_details",e="draw"+a,t="column-sizing"+a,a="destroy"+a,u=s.aoData;if(r.off(e+" "+t+" "+a),N(u,"_details").length>0){r.on(e,function(t,e){if(s!==e)return;r.rows({page:"current"}).eq(0).each(function(t){var e=u[t];if(e._detailsShow)e._details.insertAfter(e.nTr)})});r.on(t,function(t,e,n,a){if(s!==e)return;var r,o=T(e);for(var i=0,l=u.length;it?new B(e[t],this[t]):null},filter:function(t){var e=[];if(o.filter)e=o.filter.call(this,t,this);else for(var n=0,a=this.length;n").appendTo(t);h(l,n)}else{var s=!1;switch(p=null,g=n){case"ellipsis":t.append('');break;case"first":p=m.sFirst,0===f&&(s=!0);break;case"previous":p=m.sPrevious,0===f&&(s=!0);break;case"next":p=m.sNext,0!==d&&f!==d-1||(s=!0);break;case"last":p=m.sLast,0!==d&&f!==d-1||(s=!0);break;default:p=u.fnFormatNumber(n+1),g=f===n?b.sPageButtonActive:""}null!==p&&(l=u.oInit.pagingTag||"a",s&&(g+=" "+a),me(P("<"+l+">",{class:b.sPageButton+" "+g,"aria-controls":u.sTableId,"aria-disabled":s?"true":null,"aria-label":S[n],role:"link","aria-current":g===b.sPageButtonActive?"page":null,"data-dt-idx":n,tabindex:s?-1:u.iTabIndex,id:0===c&&"string"==typeof n?u.sTableId+"_"+n:null}).html(p).appendTo(t),{action:n},r))}}var p,g,n,b=u.oClasses,m=u.oLanguage.oPaginate,S=u.oLanguage.oAria.paginate||{};try{n=P(t).find(v.activeElement).data("dt-idx")}catch(t){}h(P(t).empty(),e),n!==H&&P(t).find("[data-dt-idx="+n+"]").trigger("focus")}}}),P.extend(w.ext.type.detect,[function(t,e){e=e.oLanguage.sDecimal;return l(t,e)?"num"+e:null},function(t,e){var n;return(!t||t instanceof Date||X.test(t))&&(null!==(n=Date.parse(t))&&!isNaN(n)||h(t))?"date":null},function(t,e){e=e.oLanguage.sDecimal;return l(t,e,!0)?"num-fmt"+e:null},function(t,e){e=e.oLanguage.sDecimal;return a(t,e)?"html-num"+e:null},function(t,e){e=e.oLanguage.sDecimal;return a(t,e,!0)?"html-num-fmt"+e:null},function(t,e){return h(t)||"string"==typeof t&&-1!==t.indexOf("<")?"html":null}]),P.extend(w.ext.type.search,{html:function(t){return h(t)?t:"string"==typeof t?t.replace(U," ").replace(V,""):""},string:function(t){return!h(t)&&"string"==typeof t?t.replace(U," "):t}});function ke(t,e,n,a){var r;return 0===t||t&&"-"!==t?"number"==(r=typeof t)||"bigint"==r?t:+(t=(t=e?$(t,e):t).replace&&(n&&(t=t.replace(n,"")),a)?t.replace(a,""):t):-1/0}function Me(n){P.each({num:function(t){return ke(t,n)},"num-fmt":function(t){return ke(t,n,q)},"html-num":function(t){return ke(t,n,V)},"html-num-fmt":function(t){return ke(t,n,V,q)}},function(t,e){p.type.order[t+n+"-pre"]=e,t.match(/^html\-/)&&(p.type.search[t+n]=p.type.search.html)})}P.extend(p.type.order,{"date-pre":function(t){t=Date.parse(t);return isNaN(t)?-1/0:t},"html-pre":function(t){return h(t)?"":t.replace?t.replace(/<.*?>/g,"").toLowerCase():t+""},"string-pre":function(t){return h(t)?"":"string"==typeof t?t.toLowerCase():t.toString?t.toString():""},"string-asc":function(t,e){return t").addClass(l.sSortJUIWrapper).append(o.contents()).append(P("").addClass(l.sSortIcon+" "+i.sSortingClassJUI)).appendTo(o),P(r.nTable).on("order.dt.DT",function(t,e,n,a){r===e&&(e=i.idx,o.removeClass(l.sSortAsc+" "+l.sSortDesc).addClass("asc"==a[e]?l.sSortAsc:"desc"==a[e]?l.sSortDesc:i.sSortingClass),o.find("span."+l.sSortIcon).removeClass(l.sSortJUIAsc+" "+l.sSortJUIDesc+" "+l.sSortJUI+" "+l.sSortJUIAscAllowed+" "+l.sSortJUIDescAllowed).addClass("asc"==a[e]?l.sSortJUIAsc:"desc"==a[e]?l.sSortJUIDesc:i.sSortingClassJUI))})}}});function We(t){return"string"==typeof(t=Array.isArray(t)?t.join(","):t)?t.replace(/&/g,"&").replace(//g,">").replace(/"/g,"""):t}function Ee(t,e,n,a,r){return j.moment?t[e](r):j.luxon?t[n](r):a?t[a](r):t}var Be=!1;function Ue(t,e,n){var a;if(j.moment){if(!(a=j.moment.utc(t,e,n,!0)).isValid())return null}else if(j.luxon){if(!(a=e&&"string"==typeof t?j.luxon.DateTime.fromFormat(t,e):j.luxon.DateTime.fromISO(t)).isValid)return null;a.setLocale(n)}else e?(Be||alert("DataTables warning: Formatted date without Moment.js or Luxon - https://datatables.net/tn/17"),Be=!0):a=new Date(t);return a}function Ve(s){return function(a,r,o,i){0===arguments.length?(o="en",a=r=null):1===arguments.length?(o="en",r=a,a=null):2===arguments.length&&(o=r,r=a,a=null);var l="datetime-"+r;return w.ext.type.order[l]||(w.ext.type.detect.unshift(function(t){return t===l&&l}),w.ext.type.order[l+"-asc"]=function(t,e){t=t.valueOf(),e=e.valueOf();return t===e?0:t