Usar R para descargar archivos de datos comprimidos, extraer e importar datos

Resuelto Jeromy Anglim asked hace 54 años • 10 respuestas

@EZGraphs en Twitter escribe: "Muchos archivos CSV en línea están comprimidos. ¿Hay alguna forma de descargar, descomprimir el archivo y cargar los datos en un data.frame usando R? #Rstats".

También intenté hacer esto hoy, pero terminé descargando el archivo zip manualmente.

Intenté algo como:

fileName <- "http://www.newcl.org/data/zipfiles/a1.zip"
con1 <- unz(fileName, filename="a1.dat", open = "r")

pero siento que estoy muy lejos. ¿Alguna idea?

Jeromy Anglim avatar Jan 01 '70 08:01 Jeromy Anglim
Aceptado

Los archivos Zip son en realidad más un "sistema de archivos" con metadatos de contenido, etc. Consulte help(unzip)para obtener más detalles. Entonces, para hacer lo que esbozas arriba necesitas

  1. Crea una temperatura. nombre de archivo (p. ej. tempfile())
  2. Úselo download.file()para buscar el archivo en el archivo temporal. archivo
  3. Úselo unz()para extraer el archivo de destino de temp. archivo
  4. Elimine el archivo temporal medianteunlink()

que en código (gracias por el ejemplo básico, pero esto es más simple) se ve así

temp <- tempfile()
download.file("http://www.newcl.org/data/zipfiles/a1.zip",temp)
data <- read.table(unz(temp, "a1.dat"))
unlink(temp)

Los archivos comprimidos ( .z) o gzip ( .gz) o bzip2ed ( .bz2) son solo el archivo y aquellos que puede leer directamente desde una conexión. Así que haz que el proveedor de datos lo use en su lugar :)

Dirk is no longer here avatar Jun 16 '2010 13:06 Dirk is no longer here

Sólo para que conste, intenté traducir la respuesta de Dirk al código :-P

temp <- tempfile()
download.file("http://www.newcl.org/data/zipfiles/a1.zip",temp)
con <- unz(temp, "a1.dat")
data <- matrix(scan(con),ncol=4,byrow=TRUE)
unlink(temp)
Yorgos avatar Jun 16 '2010 15:06 Yorgos

Utilicé el "descargador" del paquete CRAN que se encuentra en http://cran.r-project.org/web/packages/downloader/index.html . Más fácil.

download(url, dest="dataset.zip", mode="wb") 
unzip ("dataset.zip", exdir = "./")
unixcreeper avatar Dec 08 '2014 22:12 unixcreeper

Para Mac (y supongo que Linux)...

Si el archivo zip contiene un solo archivo, puede usar el comando bash funzip, junto con el freaddel data.tablepaquete:

library(data.table)
dt <- fread("curl http://www.newcl.org/data/zipfiles/a1.zip | funzip")

En los casos en que el archivo contenga varios archivos, puede utilizarlo tarpara extraer un archivo específico a la salida estándar:

dt <- fread("curl http://www.newcl.org/data/zipfiles/a1.zip | tar -xf- --to-stdout *a1.dat")
dnlbrky avatar Jun 15 '2016 00:06 dnlbrky