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
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)
}
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