Usare R per scaricare file di dati compressi, estrarre e importare dati

@EZGraphs su Twitter scrive: “Un sacco di csv online sono compressi, c’è un modo per scaricare, decomprimere l’archivio e caricare i dati su un data.frame usando R? #Rstats”

Stavo anche provando a farlo oggi, ma ho finito per scaricare il file zip manualmente.

Ho provato qualcosa come:

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

ma mi sento come se fossi molto lontano. qualche idea?

Gli archivi Zip sono in realtà più un “filesystem” con metadati di contenuti, ecc. Vedi help(unzip) per i dettagli. Quindi, per fare ciò che si disegna sopra, è necessario

  1. Crea un temp. nome del file (es. tempfile() )
  2. Usa download.file() per recuperare il file nella temp. file
  3. Utilizzare unz() per estrarre il file di destinazione da temp. file
  4. Rimuovere il file temporaneo tramite unlink()

che in codice (grazie per l’esempio di base, ma questo è più semplice) sembra

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

I file compressi ( .z ) o gzip ( .gz ) o bzip2ed ( .bz2 ) sono solo il file e quelli che puoi leggere direttamente da una connessione. Quindi, usa il fornitore di dati per utilizzarlo, invece 🙂

Per la cronaca, ho provato a tradurre la risposta di Dirk nel codice 😛

 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) 

Ho usato il pacchetto CRAN “downloader” trovato su http://cran.r-project.org/web/packages/downloader/index.html . Molto più facile.

 download(url, dest="dataset.zip", mode="wb") unzip ("dataset.zip", exdir = "./") 

Per Mac (e presumo Linux) …

Se l’archivio zip contiene un singolo file, puoi utilizzare il comando bash funzip , in combinazione con fread dal pacchetto data.table :

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

Nei casi in cui l'archivio contiene più file, è ansible utilizzare tar per estrarre un file specifico su stdout:

 dt < - fread("curl http://www.newcl.org/data/zipfiles/a1.zip | tar -xf- --to-stdout *a1.dat") 

Prova questo codice. Per me funziona:

 unzip(zipfile="", exdir="") 

Esempio:

 unzip(zipfile="./data/Data.zip",exdir="./data") 

Per fare ciò utilizzando data.table, ho scoperto che i seguenti lavori. Sfortunatamente, il link non funziona più, quindi ho usato un link per un altro set di dati.

 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) 

So che questo è ansible in una singola riga dal momento che è ansible passare gli script di bash a fread , ma non sono sicuro di come scaricare un file .zip, estrarre e passare un singolo file da quello a fread .

Ecco un esempio che funziona per i file che non possono essere letti con la funzione read.table . Questo esempio legge un file .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))