Verwenden von R zum Herunterladen gezippter Datendateien, Extrahieren und Importieren von Daten

@EZGraphs auf Twitter schreibt: “Viele Online-CSVs sind gezippt. Gibt es eine Möglichkeit, das Archiv herunterzuladen und zu entpacken und die Daten mit R? #Rstats in einen dat.frame zu laden?”

Ich habe auch versucht, dies heute zu tun, aber am Ende habe ich nur die Zip-Datei manuell heruntergeladen.

Ich habe versucht, etwas wie:

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

aber ich fühle mich, als wäre ich weit weg. Irgendwelche Gedanken?

Zip-Archive sind eigentlich eher ein ‘Dateisystem’ mit Inhaltsmetadaten etc. Siehe help(unzip) für Details. Um das zu tun, was Sie skizzieren, müssen Sie

  1. Erstellen Sie ein Temp. Dateiname (zB tempfile() )
  2. Verwenden Sie download.file() , um die Datei in den Temp zu holen. Datei
  3. Verwenden Sie unz() , um die Zieldatei von temp zu extrahieren. Datei
  4. Entfernen Sie die temporäre Datei über unlink()

was im Code (danke für einfaches Beispiel, aber das ist einfacher) aussieht

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

Komprimierte ( .z ) oder gezippte ( .z ) oder bzip2ed (.bz2) Dateien sind nur die Datei und diejenigen, die Sie direkt von einer Verbindung lesen können. Also lass den Datenprovider das stattdessen verwenden 🙂

Nur zur Erinnerung, ich habe versucht, Dirks Antwort in Code zu übersetzen: -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) 

Ich habe das CRAN-Paket “Downloader” unter http://cran.r-project.org/web/packages/downloader/index.html verwendet . Viel einfacher.

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

Für Mac (und ich nehme Linux an) …

Wenn das Zip-Archiv eine einzige Datei enthält, können Sie den bash-Befehl funzip in Verbindung mit fread aus dem Paket data.table :

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

In Fällen, in denen das Archiv mehrere Dateien enthält, können Sie stattdessen tar verwenden, um eine bestimmte Datei nach stdout zu extrahieren:

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

Probieren Sie diesen Code aus. Für mich geht das:

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

Beispiel:

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

Um dies mit data.table zu tun, habe ich Folgendes gefunden. Leider funktioniert der Link nicht mehr, also habe ich einen Link für einen anderen Datensatz verwendet.

 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) 

Ich weiß, dass dies in einer einzigen Zeile möglich ist, da Sie bash-Skripte fread , aber ich bin mir nicht sicher, wie Sie eine .zip-Datei herunterladen, extrahieren und eine einzige Datei von dieser Datei an fread .

Hier ist ein Beispiel, das für Dateien funktioniert, die nicht mit der function read.table können. In diesem Beispiel wird eine .xls-Datei gelesen.

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