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.

1. CSV con readr

library(readr)

# Leer un archivo CSV
df_csv <- read_csv("datos/archivo.csv")

2. Excel con readxl

library(readxl)

# Leer la primera hoja del archivo Excel
df_excel <- read_excel("datos/archivo.xlsx")

# Leer una hoja específica
df_hoja2 <- read_excel("datos/archivo.xlsx", sheet = "Hoja2")

3. TXT delimitado

library(readr)

# Leer archivo TXT con tabulaciones
df_txt <- read_delim("datos/archivo.txt", delim = "\t")

# Leer archivo CSV con punto y coma
df_csv2 <- read_csv2("datos/archivo_punto_coma.csv")

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.

📦 Librerías necesarias


# Librería principal para exportar fácilmente en múltiples formatos
library(rio)

# Alternativas si deseas más control:
library(writexl)  # Para Excel

✅ Exportar con rio::export()


# Exportar a Excel (.xlsx)
export(df, "datos_limpios.xlsx")
# Exportar a CSV (.csv, con punto decimal)
export(df, "datos_limpios.csv")

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(df, "datos_limpios_colombia.csv", row.names = FALSE)

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)

writexl::write_xlsx(df, "datos_limpios_alt.xlsx")

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
  )
# importar el listado de casos
linelist <- import("C:/Users/wsand/Downloads/linelist_cleaned.rds")
## Warning: Missing `trust` will be set to FALSE by default for RDS in 2.0.0.
head(linelist)
##   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
library(skimr)
## obtener información sobre cada variable de un conjunto de datos 
skim(linelist)
Data summary
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.

linelist %>% tabyl(age_cat)
##  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.

linelist %>% tabyl(age_cat, gender)
##  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%)