Importación y exportación
Objetivo
Aprender a importar y exportar datos desde y hacia múltiples formatos en R, incluyendo CSV, Excel, TXT, RDS, SPSS, entre otros, usando tanto funciones especializadas como el paquete rio.
2. Excel con readxl
3. TXT delimitado
4. Uso de rio (importación automática)
library(rio)
# Importar según extensión del archivo
df1 <- import("datos/archivo.csv")
df2 <- import("datos/archivo.xlsx")
df3 <- import("datos/archivo.sav") # SPSS#5. Exportación de resultados
En esta sección se exportan los datos limpios en distintos formatos, de forma que puedan ser usados posteriormente en informes, análisis o compartidos con otros usuarios.
Se utilizará principalmente la librería rio, que permite
importar y exportar datos en múltiples formatos con una única función
(import() y export()), facilitando el trabajo
del analista.
Exportar a RDS (formato nativo de R)
export(df, “datos_limpios.rds”) Estas tres líneas generan:
Un archivo de Excel fácil de abrir y compartir
Un CSV compatible con otras herramientas (p. ej., Python, Excel, SPSS)
Un archivo RDS ideal para recargar el dataframe en futuras sesiones de R con readRDS() sin perder tipos ni estructura
📁 Exportar CSV con coma decimal (formato colombiano)
write.csv2() usa ; como separador de columnas y , como separador decimal, útil para reportes en regiones como Colombia o Europa.
📁 Exportar con writexl (Excel sin dependencias externas)
Esta opción genera archivos Excel sin requerir Java ni otras librerías adicionales.
pacman::p_load(
rio, # Importación de ficheros
here, # localizador de ficheros
skimr, # obtener una visión general de los datos
tidyverse, # gestión de datos + gráficos ggplot2
gtsummary, # resumen estadístico y tests
rstatix, # resumen estadístico y pruebas estadísticas
janitor, # añadir totales y porcentajes a las tablas
scales, # convertir fácilmente proporciones en porcentajes
flextable # convertir tablas en imágenes bonitas
)## Warning: Missing `trust` will be set to FALSE by default for RDS in 2.0.0.
## case_id generation date_infection date_onset date_hospitalisation
## 1 5fe599 4 2014-05-08 2014-05-13 2014-05-15
## 2 8689b7 4 <NA> 2014-05-13 2014-05-14
## 3 11f8ea 2 <NA> 2014-05-16 2014-05-18
## 4 b8812a 3 2014-05-04 2014-05-18 2014-05-20
## 5 893f25 3 2014-05-18 2014-05-21 2014-05-22
## 6 be99c8 3 2014-05-03 2014-05-22 2014-05-23
## date_outcome outcome gender age age_unit age_years age_cat age_cat5
## 1 <NA> <NA> m 2 years 2 0-4 0-4
## 2 2014-05-18 Recover f 3 years 3 0-4 0-4
## 3 2014-05-30 Recover m 56 years 56 50-69 55-59
## 4 <NA> <NA> f 18 years 18 15-19 15-19
## 5 2014-05-29 Recover m 3 years 3 0-4 0-4
## 6 2014-05-24 Recover f 16 years 16 15-19 15-19
## hospital lon lat infector source wt_kg
## 1 Other -13.21574 8.468973 f547d6 other 27
## 2 Missing -13.21523 8.451719 <NA> <NA> 25
## 3 St. Mark's Maternity Hospital (SMMH) -13.21291 8.464817 <NA> <NA> 91
## 4 Port Hospital -13.23637 8.475476 f90f5f other 41
## 5 Military Hospital -13.22286 8.460824 11f8ea other 36
## 6 Port Hospital -13.22263 8.461831 aec8ec other 56
## ht_cm ct_blood fever chills cough aches vomit temp time_admission bmi
## 1 48 22 no no yes no yes 36.8 <NA> 117.18750
## 2 59 22 <NA> <NA> <NA> <NA> <NA> 36.9 09:36 71.81844
## 3 238 21 <NA> <NA> <NA> <NA> <NA> 36.9 16:48 16.06525
## 4 135 23 no no no no no 36.8 11:22 22.49657
## 5 71 23 no no yes no yes 36.9 12:60 71.41440
## 6 116 21 no no yes no yes 37.6 14:13 41.61712
## days_onset_hosp
## 1 2
## 2 1
## 3 2
## 4 2
## 5 1
## 6 1
| Name | linelist |
| Number of rows | 5888 |
| Number of columns | 30 |
| _______________________ | |
| Column type frequency: | |
| character | 13 |
| Date | 4 |
| factor | 2 |
| numeric | 11 |
| ________________________ | |
| Group variables | None |
Variable type: character
| skim_variable | n_missing | complete_rate | min | max | empty | n_unique | whitespace |
|---|---|---|---|---|---|---|---|
| case_id | 0 | 1.00 | 6 | 6 | 0 | 5888 | 0 |
| outcome | 1323 | 0.78 | 5 | 7 | 0 | 2 | 0 |
| gender | 278 | 0.95 | 1 | 1 | 0 | 2 | 0 |
| age_unit | 0 | 1.00 | 5 | 6 | 0 | 2 | 0 |
| hospital | 0 | 1.00 | 5 | 36 | 0 | 6 | 0 |
| infector | 2088 | 0.65 | 6 | 6 | 0 | 2697 | 0 |
| source | 2088 | 0.65 | 5 | 7 | 0 | 2 | 0 |
| fever | 249 | 0.96 | 2 | 3 | 0 | 2 | 0 |
| chills | 249 | 0.96 | 2 | 3 | 0 | 2 | 0 |
| cough | 249 | 0.96 | 2 | 3 | 0 | 2 | 0 |
| aches | 249 | 0.96 | 2 | 3 | 0 | 2 | 0 |
| vomit | 249 | 0.96 | 2 | 3 | 0 | 2 | 0 |
| time_admission | 765 | 0.87 | 5 | 5 | 0 | 1072 | 0 |
Variable type: Date
| skim_variable | n_missing | complete_rate | min | max | median | n_unique |
|---|---|---|---|---|---|---|
| date_infection | 2087 | 0.65 | 2014-03-19 | 2015-04-27 | 2014-10-11 | 359 |
| date_onset | 256 | 0.96 | 2014-04-07 | 2015-04-30 | 2014-10-23 | 367 |
| date_hospitalisation | 0 | 1.00 | 2014-04-17 | 2015-04-30 | 2014-10-23 | 363 |
| date_outcome | 936 | 0.84 | 2014-04-19 | 2015-06-04 | 2014-11-01 | 371 |
Variable type: factor
| skim_variable | n_missing | complete_rate | ordered | n_unique | top_counts |
|---|---|---|---|---|---|
| age_cat | 86 | 0.99 | FALSE | 8 | 0-4: 1095, 5-9: 1095, 20-: 1073, 10-: 941 |
| age_cat5 | 86 | 0.99 | FALSE | 17 | 0-4: 1095, 5-9: 1095, 10-: 941, 15-: 743 |
Variable type: numeric
| skim_variable | n_missing | complete_rate | mean | sd | p0 | p25 | p50 | p75 | p100 | hist |
|---|---|---|---|---|---|---|---|---|---|---|
| generation | 0 | 1.00 | 16.56 | 5.79 | 0.00 | 13.00 | 16.00 | 20.00 | 37.00 | ▁▆▇▂▁ |
| age | 86 | 0.99 | 16.07 | 12.62 | 0.00 | 6.00 | 13.00 | 23.00 | 84.00 | ▇▅▁▁▁ |
| age_years | 86 | 0.99 | 16.02 | 12.64 | 0.00 | 6.00 | 13.00 | 23.00 | 84.00 | ▇▅▁▁▁ |
| lon | 0 | 1.00 | -13.23 | 0.02 | -13.27 | -13.25 | -13.23 | -13.22 | -13.21 | ▅▃▃▆▇ |
| lat | 0 | 1.00 | 8.47 | 0.01 | 8.45 | 8.46 | 8.47 | 8.48 | 8.49 | ▅▇▇▇▆ |
| wt_kg | 0 | 1.00 | 52.64 | 18.58 | -11.00 | 41.00 | 54.00 | 66.00 | 111.00 | ▁▃▇▅▁ |
| ht_cm | 0 | 1.00 | 124.96 | 49.52 | 4.00 | 91.00 | 129.00 | 159.00 | 295.00 | ▂▅▇▂▁ |
| ct_blood | 0 | 1.00 | 21.21 | 1.69 | 16.00 | 20.00 | 22.00 | 22.00 | 26.00 | ▁▃▇▃▁ |
| temp | 149 | 0.97 | 38.56 | 0.98 | 35.20 | 38.20 | 38.80 | 39.20 | 40.80 | ▁▂▂▇▁ |
| bmi | 0 | 1.00 | 46.89 | 55.39 | -1200.00 | 24.56 | 32.12 | 50.01 | 1250.00 | ▁▁▇▁▁ |
| days_onset_hosp | 256 | 0.96 | 2.06 | 2.26 | 0.00 | 1.00 | 1.00 | 3.00 | 22.00 | ▇▁▁▁▁ |
17.3 paquete janitor Los paquetes janitor ofrecen la función tabyl() para producir tabulaciones y tabulaciones cruzadas, que pueden ser “adornadas” o modificadas con funciones de ayuda para mostrar porcentajes, proporciones, recuentos, etc.
A continuación, enlazamos el dataframe linelist con pipe a las funciones de limpieza e imprimimos el resultado. Si lo deseas, también puedes guardar las tablas resultantes con el operador de asignación <-.
Tabyl simple El uso por defecto de tabyl() en una columna específica produce los valores únicos, los recuentos y sus proporciones por columna. Las proporciones pueden tener muchos dígitos. Puedes ajustar el número de decimales con adorn_rounding() como se describe a continuación.
## age_cat n percent valid_percent
## 0-4 1095 0.185971467 0.188728025
## 5-9 1095 0.185971467 0.188728025
## 10-14 941 0.159816576 0.162185453
## 15-19 743 0.126188859 0.128059290
## 20-29 1073 0.182235054 0.184936229
## 30-49 754 0.128057065 0.129955188
## 50-69 95 0.016134511 0.016373664
## 70+ 6 0.001019022 0.001034126
## <NA> 86 0.014605978 NA
Como puedes ver arriba, si hay valores que faltan se muestran en una fila etiquetada como NA. Puedes suprimirlos con show_na = FALSE. Si no hay valores faltantes, esta fila no aparecerá. Si hay valores faltantes, todas las proporciones se dan como crudas (el denominador incluye los recuentos de NA) y “válidas” (el denominador excluye los recuentos de NA).
Si la columna es de tipo factor y sólo hay ciertos niveles en sus datos, todos los niveles seguirán apareciendo en la tabla. Puedes suprimir esta característica especificando show_missing_levels = FALSE. Lee más en la página de Factores.
Tabulación cruzada
Los recuentos de tabulación cruzada se consiguen añadiendo una o más columnas adicionales dentro de tabyl(). Ten en cuenta que ahora sólo se muestran los recuentos - Las proporciones y porcentajes se pueden añadir con los pasos adicionales que se muestran a continuación.
## age_cat f m NA_
## 0-4 640 416 39
## 5-9 641 412 42
## 10-14 518 383 40
## 15-19 359 364 20
## 20-29 468 575 30
## 30-49 179 557 18
## 50-69 2 91 2
## 70+ 0 5 1
## <NA> 0 0 86
✨ Adornando un tabyl con janitor Las funciones de adorno del paquete janitor permiten modificar y mejorar la presentación de tablas tabyl. Puedes encadenarlas con el operador |> o %>% para aplicar múltiples transformaciones consecutivamente.
| Función | Resultado |
|---|---|
adorn_totals() |
Añade los totales. Usa where = "row",
"col", o "both". Puedes cambiar el nombre del
total con name = "Total". |
adorn_percentages() |
Convierte recuentos en proporciones. Usa
denominator = "row", "col" o
"all". |
adorn_pct_formatting() |
Convierte proporciones en porcentajes. Controla los decimales con
digits =. Elimina % con
affix_sign = FALSE. |
adorn_rounding() |
Redondea proporciones a digits =. Para porcentajes, es
preferible adorn_pct_formatting(). |
adorn_ns() |
Añade los recuentos a una tabla de proporciones o porcentajes. Usa
position = "rear" para mostrarlos entre paréntesis al
final, o "front" para ponerlos al inicio. |
adorn_title() |
Añade títulos a las filas o columnas con row_name = y/o
col_name =. Ideal para presentación en tablas
cruzadas. |
linelist %>% # lista de casos
tabyl(age_cat) %>% # tabular recuentos y proporciones por categoría de edad
adorn_pct_formatting() # convertir proporciones en porcentajes## age_cat n percent valid_percent
## 0-4 1095 18.6% 18.9%
## 5-9 1095 18.6% 18.9%
## 10-14 941 16.0% 16.2%
## 15-19 743 12.6% 12.8%
## 20-29 1073 18.2% 18.5%
## 30-49 754 12.8% 13.0%
## 50-69 95 1.6% 1.6%
## 70+ 6 0.1% 0.1%
## <NA> 86 1.5% -
linelist %>%
tabyl(age_cat, gender) %>%
adorn_totals(where = "col") %>%
adorn_percentages(denominator = "col") %>%
adorn_pct_formatting() %>%
adorn_ns(position = "front") %>%
adorn_title(
row_name = "Age Category",
col_name = "Gender",
placement = "combined") %>% # esto es necesario para imprimir como imagen
flextable::flextable() %>% # convertir a imagen bonita
flextable::autofit() # formatear a una línea por fila Age Category/Gender | f | m | NA_ | Total |
|---|---|---|---|---|
0-4 | 640 (22.8%) | 416 (14.8%) | 39 (14.0%) | 1,095 (18.6%) |
5-9 | 641 (22.8%) | 412 (14.7%) | 42 (15.1%) | 1,095 (18.6%) |
10-14 | 518 (18.5%) | 383 (13.7%) | 40 (14.4%) | 941 (16.0%) |
15-19 | 359 (12.8%) | 364 (13.0%) | 20 (7.2%) | 743 (12.6%) |
20-29 | 468 (16.7%) | 575 (20.5%) | 30 (10.8%) | 1,073 (18.2%) |
30-49 | 179 (6.4%) | 557 (19.9%) | 18 (6.5%) | 754 (12.8%) |
50-69 | 2 (0.1%) | 91 (3.2%) | 2 (0.7%) | 95 (1.6%) |
70+ | 0 (0.0%) | 5 (0.2%) | 1 (0.4%) | 6 (0.1%) |
0 (0.0%) | 0 (0.0%) | 86 (30.9%) | 86 (1.5%) |