Problema

Realizando un estudio respecto a diferentes datasets publicados en el portal de datos abiertos de la justicia argentina me encontré con la dificultad de que muchas publicaciones ofrecen la información en un archivo .zip que contiene dentro múltiples CSV.

Para cada caso tenía que descargar el zip, extraer manualmente los archivos y luego ir subiéndolos a R uno por uno

Solución

Después de varios intentos, construí una función que soluciono mí problema en pocos segundos:

CSVs_From_ZIP<-function(url) {
  # crea un archivo temporal
  temp <- tempfile()
  
  # descarga el .zip en ese archivo temporal
  download.file(url,temp)
  
  # identifica el contenido del archivo
  file_list <- unzip(temp, list = TRUE)
  
  # extrae documento por documento
  lapply(file_list$Name,function(x) {
    suppressMessages(
    readr::read_csv(unz(temp,x)))->hh
    return(hh)
  })->lista
  
  # se desconecta del archivo temporal
  unlink(temp)
  
  # devuelve la lista con los datasets
  return(lista)
}

Ejemplo

Dentro del sitio http://datos.jus.gob.ar/dataset/inscripciones-iniciales-de-autos se encuentran los documentos .zip a descargar:

url2018<-"http://datos.jus.gob.ar/dataset/37c9ad39-f092-44be-9b7f-1201b3c4b7a8/resource/0648ef53-b00c-4446-8e73-cd24e8bad2a7/download/dnrpa-inscripciones-iniciales-autos-2018.zip"

url2019<-"http://datos.jus.gob.ar/dataset/37c9ad39-f092-44be-9b7f-1201b3c4b7a8/resource/4a434f6a-8d2c-492b-93ea-d045f3d9961a/download/dnrpa-inscripciones-iniciales-autos-2019.zip"

Utilizo la función para descargar los documentos que contiene cada archivo:

CSVs_From_ZIP(url = url2018)->lista2018
CSVs_From_ZIP(url = url2019)->lista2019

Chequeando rápidamente, se puede ver que todos los documentos tienen la misma cantidad de columnas:

summary(unlist(lapply(lista2018,ncol)))
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##      25      25      25      25      25      25
summary(unlist(lapply(lista2019,ncol)))
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##      25      25      25      25      25      25

Y los mismos nombres:

table(unlist(lapply(lista2018,names)))
## 
##                automotor_anio_modelo               automotor_marca_codigo 
##                                   12                                   12 
##          automotor_marca_descripcion              automotor_modelo_codigo 
##                                   12                                   12 
##         automotor_modelo_descripcion                     automotor_origen 
##                                   12                                   12 
##                automotor_tipo_codigo           automotor_tipo_descripcion 
##                                   12                                   12 
##                 automotor_uso_codigo            automotor_uso_descripcion 
##                                   12                                   12 
##            fecha_inscripcion_inicial            registro_seccional_codigo 
##                                   12                                   12 
##       registro_seccional_descripcion         registro_seccional_provincia 
##                                   12                                   12 
##              titular_anio_nacimiento          titular_domicilio_localidad 
##                                   12                                   12 
##          titular_domicilio_provincia titular_domicilio_provincia_indec_id 
##                                   12                                   12 
##                       titular_genero              titular_pais_nacimiento 
##                                   12                                   12 
##     titular_pais_nacimiento_indec_id       titular_porcentaje_titularidad 
##                                   12                                   12 
##                 titular_tipo_persona                        tramite_fecha 
##                                   12                                   12 
##                         tramite_tipo 
##                                   12
table(unlist(lapply(lista2019,names)))
## 
##                automotor_anio_modelo               automotor_marca_codigo 
##                                    8                                    8 
##          automotor_marca_descripcion              automotor_modelo_codigo 
##                                    8                                    8 
##         automotor_modelo_descripcion                     automotor_origen 
##                                    8                                    8 
##                automotor_tipo_codigo           automotor_tipo_descripcion 
##                                    8                                    8 
##                 automotor_uso_codigo            automotor_uso_descripcion 
##                                    8                                    8 
##            fecha_inscripcion_inicial            registro_seccional_codigo 
##                                    8                                    8 
##       registro_seccional_descripcion         registro_seccional_provincia 
##                                    8                                    8 
##              titular_anio_nacimiento          titular_domicilio_localidad 
##                                    8                                    8 
##          titular_domicilio_provincia       titular_domicilio_provincia_id 
##                                    8                                    5 
## titular_domicilio_provincia_indec_id                       titular_genero 
##                                    3                                    8 
##              titular_pais_nacimiento           titular_pais_nacimiento_id 
##                                    8                                    5 
##     titular_pais_nacimiento_indec_id       titular_porcentaje_titularidad 
##                                    3                                    8 
##                 titular_tipo_persona                        tramite_fecha 
##                                    8                                    8 
##                         tramite_tipo 
##                                    8

Por tanto, unifico todos los data.frames en uno solo:

require(data.table)
rbind(rbindlist(lista2018),
      rbindlist(lista2019))->db