txt - Usando R para descargar archivos de datos comprimidos, extraer e importar datos
leer csv en r (7)
Aquí hay un ejemplo que funciona para archivos que no se pueden leer con la función read.table
. Este ejemplo lee un archivo .xls.
url <-"https://www1.toronto.ca/City_Of_Toronto/Information_Technology/Open_Data/Data_Sets/Assets/Files/fire_stns.zip"
temp <- tempfile()
temp2 <- tempfile()
download.file(url, temp)
unzip(zipfile = temp, exdir = temp2)
data <- read_xls(file.path(temp2, "fire station x_y.xls"))
unlink(c(temp, temp2))
@EZGraphs en Twitter escribe: "Muchos de los csvs 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é simplemente 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 me siento como si estuviera muy lejos. ¿Alguna idea?
Los archivos Zip son en realidad más un "sistema de archivos" con metadatos de contenido, etc. Consulte la help(unzip)
para obtener más información. Entonces, para hacer lo que esbozas arriba, necesitas
- Crea una temperatura nombre de archivo (ej.
tempfile()
) - Use
download.file()
para buscar el archivo en la temperatura. archivo - Use
unz()
para extraer el archivo de destino de la temperatura. archivo - Eliminar el archivo temporal a través de
unlink()
que en el código (gracias por el ejemplo básico, pero esto es más simple) se ve como
temp <- tempfile()
download.file("http://www.newcl.org/data/zipfiles/a1.zip",temp)
data <- read.table(unz(temp, "a1.dat"))
unlink(temp)
Los .z
comprimidos ( .z
) o gzipped ( .gz
) o bzip2ed ( .bz2
) son solo el archivo y aquellos que puede leer directamente desde una conexión. Así que obtenga el proveedor de datos para usar eso en su lugar :)
Para Mac (y supongo que Linux) ...
Si el archivo zip contiene un solo archivo, puede usar el comando bash funzip
, en fread
con fread
del paquete data.table
:
library(data.table)
dt <- fread("curl http://www.newcl.org/data/zipfiles/a1.zip | funzip")
En los casos en que el archivo contiene varios archivos, puede usar tar
para extraer un archivo específico a stdout:
dt <- fread("curl http://www.newcl.org/data/zipfiles/a1.zip | tar -xf- --to-stdout *a1.dat")
Para hacer esto usando data.table, encontré que el siguiente funciona. Desafortunadamente, el enlace ya no funciona, así que utilicé un enlace para otro conjunto de datos.
library(data.table)
temp <- tempfile()
download.file("https://www.bls.gov/tus/special.requests/atusact_0315.zip", temp)
timeUse <- fread(unzip(temp, files = "atusact_0315.dat"))
rm(temp)
Sé que esto es posible en una sola línea, ya que puedes pasar los scripts bash a fread
, pero no estoy seguro de cómo descargar un archivo .zip, extraer y pasar un solo archivo de eso para que se fread
.
Para que conste, traté de 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)
Prueba este código Esto funciona para mi:
unzip(zipfile="<directory and filename>",
exdir="<directory where the content will be extracted>")
Ejemplo:
unzip(zipfile="./data/Data.zip",exdir="./data")
Utilicé el paquete "descargador" de 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 = "./")