2016-10-06 5 views
0

Das folgende Codebeispiel dient zum Herunterladen von Volkszählungsdaten nach Bundesstaat von der Website census.gov. Das Problem ist, dass die führenden Nullen gelöscht werden, wenn ich als CSV-Datei herunterladen. Wie behalte ich die ursprüngliche Struktur der Dateien beim Herunterladen?Herunterladen von Dateien in R unter Beibehaltung der ursprünglichen Struktur

stateFIPScodes<-seq(10,13,1) 

    for(i in 1:length(stateFIPScodes)){ 
     URL<-paste("https://www.census.gov/popest/data/intercensal/county/files/CO-EST00INT- ALLDATA-",stateFIPScodes[i],".csv",sep="") 
     destfile<-paste("state2000_2010_",stateFIPScodes[i],".csv" ,sep="") # CSV files drop leading zero!! 
     download.file(URL, destfile) 
} 

Vielen Dank!

+3

Sie die Daten mit Excel oder einem Texteditor betrachten sind? Excel hat die Tendenz, die Nullen zu entfernen, indem Werte als Zahlen und nicht als Zeichenfolgen behandelt werden. Wenn Sie die Datei mit einem einfachen Texteditor öffnen und die Nullen dort stehen, zeigt dies an, dass Ihr Code in Ordnung ist und Sie Excel einfach überlisten müssen. – JorganPubshire

+1

@JorganPubshire Danke. Ich habe die Dateien so konvertiert, dass sie als Textdokument anstelle von Excel heruntergeladen wurden und scheinbar die ursprüngliche Struktur beibehalten. – Meli

Antwort

1

Es scheint, als ob die Dateien korrekt heruntergeladen, aber sie sind richtig: Wenn Sie read.csv verwenden, um die Daten in R zu laden, dann werden einige der Spalten als numeric interpretiert, und deshalb verlieren sie die führenden Nullen.

Code zu nehmen, die Dateien herunterlädt -

stateFIPScodes<-seq(10,13,1) 

for(i in seq_along(stateFIPScodes)){ 
    code <- stateFIPScodes[[i]] 
    URL <- paste0("https://www.census.gov/popest/data/intercensal/county/files/CO-EST00INT-ALLDATA-", code, ".csv") 
    destfile <- paste0("state2000_2010_",code,".csv") 
    download.file(URL, destfile) 
} 

Wenn wir verwenden Basis read.csv wir keine nachfolgenden Nullen erhalten:

library(dplyr) 

read.csv("state2000_2010_10.csv") %>% 
    select(1:5) %>% 
    head 

#> SUMLEV STATE COUNTY STNAME  CTYNAME 
#> 1  50 10  1 Delaware Kent County 
#> 2  50 10  1 Delaware Kent County 
#> 3  50 10  1 Delaware Kent County 
#> 4  50 10  1 Delaware Kent County 
#> 5  50 10  1 Delaware Kent County 
#> 6  50 10  1 Delaware Kent County 

Das ist, weil die ersten paar Spalten als numerische lesen werden.

read.csv("state2000_2010_10.csv") %>% str() 
#> 'data.frame': 780 obs. of 50 variables: 
#> $ SUMLEV  : int 50 50 50 50 50 50 50 50 50 50 ... 
#> $ STATE  : int 10 10 10 10 10 10 10 10 10 10 ... 
#> $ COUNTY  : int 1 1 1 1 1 1 1 1 1 1 ... 

Es gibt zwei Möglichkeiten, dieses Problem zu beheben:

  1. manuell die Datentypen in read.csv passieren, oder verhindern, nur alle Umwandlungen von colClasses = "character" hinzufügen.
  2. Verwenden Sie readr::read_csv, die es richtig behandelt.

Wir konnten nur verhindern automatischen Zwang:

read.csv("state2000_2010_10.csv", colClasses = "character") %>% str() 
#> 'data.frame': 780 obs. of 50 variables: 
#> $ SUMLEV  : chr "050" "050" "050" "050" ... 
#> $ STATE  : chr "10" "10" "10" "10" ... 
#> $ COUNTY  : chr "001" "001" "001" "001" ... 
#> $ STNAME  : chr "Delaware" "Delaware" "Delaware" "Delaware" ... 

Sie würden wählen müssen, welche Spalten Sie as.numeric werfen wollten.

Oder Sie könnten die Spalten auswählen, z.

read.csv("state2000_2010_10.csv", 
     colClasses = c(
      SUMLEV = "character", 
      STATE = "numeric", 
      COUNTY = "character" 
     )) %>% 
    select(1:5) %>% 
    head 

#> SUMLEV STATE COUNTY STNAME  CTYNAME 
#> 1 050 10 001 Delaware Kent County 
#> 2 050 10 001 Delaware Kent County 
#> 3 050 10 001 Delaware Kent County 
#> 4 050 10 001 Delaware Kent County 
#> 5 050 10 001 Delaware Kent County 
#> 6 050 10 001 Delaware Kent County 

Zweitens könnte man readr, verwenden Sie die intelligentere Spalte Typinferenz hat:

#> read_csv("state2000_2010_10.csv") %>% 
#> select(1:5) %>% 
#> head 
#> # A tibble: 6 × 5 
#> SUMLEV STATE COUNTY STNAME  CTYNAME 
#> <chr> <int> <chr> <chr>  <chr> 
#> 1 050 10 001 Delaware Kent County 
#> 2 050 10 001 Delaware Kent County 
#> 3 050 10 001 Delaware Kent County 
#> 4 050 10 001 Delaware Kent County 
#> 5 050 10 001 Delaware Kent County 
#> 6 050 10 001 Delaware Kent County 
+0

Scheint übermäßig komplex für eine Antwort, die gerade hätte sein können ... use: 'colClasses =" character ", stringsAsFactors = FALSE'. –

Verwandte Themen