2015-11-14 46 views
4

我有一個函數,可以在輸入州名縮寫(例如「KY」或「AL」)時列出每個州的所有州的郵政編碼和種羣。通過輸入「ALL」返回函數中的所有值

我想在輸入「全部」時返回所有的郵政編碼和人口,但我似乎無法弄清楚如何做到這一點。我試圖在函數中的for循環中寫入,以取得成功。

下面是函數:

StatePop1 <- function(StAbb="KY"){ 
    library(rjson) 

    St <- c('AL','AK','AZ','AR','CA','CO','CT','DE','FL','GA','HI','ID','IL','IN','IA','KS','KY','LA','ME','MD','MA','MI','MN','MS','MO','MT','NE','NV','NH','NJ','NM','NY','NC','ND','OH','OK','OR','PA','RI','SC','SD','TN','TX','UT','VT','VA','WA','WV','WI','WY') 
    FI <- c('01','02','04','05','06','08','09','10','12','13','15','16','17','18','19','20','21','22','23','24','25','26','27','28','29','30','31','32','33','34','35','36','37','38','39','40','41','42','44','45','46','47','48','49','50','51','53','54','55','56') 
    FIPS.table <- data.frame(St,FI,stringsAsFactors = FALSE) 
    StAbb <- toupper(StAbb) 
    fips_code <- FIPS.table[FIPS.table$St == StAbb,"FI"] 
    json_file <- paste("http://api.census.gov/data/2010/sf1?get=P0010001&for=zip+code+tabulation+area:*&in=state:",fips_code,sep="") 
    json_data <- fromJSON(file=json_file) 
    Pop <- as.data.frame(do.call("rbind", json_data), stringsAsFactors = FALSE) 
    names(Pop) <- c("Population","FIPS","ZipCode") 
    Pop <- Pop[-1,] 
    Pop$Population <- as.numeric(Pop$Population) 
    Pop$ZipCode <- as.character(Pop$ZipCode) 
    Pop$State <- StAbb 
    Pop <- Pop[,c("State","ZipCode","Population")] 

    return(Pop) 
} 

任何幫助,將不勝感激。

回答

4

您只需要對輸入進行矢量化處理,以便它可以採用任意數量的狀態,並且如果它是'ALL',那麼將其作爲整個狀態列表(也可以內置爲state.abb)。我切換到jsonlite,因爲它更快,但應該是相同的功能。

StatePop1 <- function(StAbb="KY"){ 
    library(jsonlite) 
    if (length(StAbb) == 1 && StAbb == "ALL") StAbb <- state.abb # check for ALL 
    FI <- c('01','02','04','05','06','08','09','10','12','13','15','16','17','18','19','20','21','22','23','24','25','26','27','28','29','30','31','32','33','34','35','36','37','38','39','40','41','42','44','45','46','47','48','49','50','51','53','54','55','56') 
    FIPS.table <- data.frame(St=state.abb, FI, stringsAsFactors = FALSE) 
    StAbb <- toupper(StAbb) 
    fips_code <- FIPS.table[FIPS.table$St %in% StAbb,"FI"] # change to %in% 
    json_file <- paste("http://api.census.gov/data/2010/sf1?get=P0010001&for=zip+code+tabulation+area:*&in=state:",fips_code,sep="") 
    json_data <- lapply(json_file, jsonlite::fromJSON) 
    Pop <- data.frame(do.call(rbind, json_data), stringsAsFactors = FALSE) # dont need as.data.frame 
    names(Pop) <- c("Population","FIPS","ZipCode") 
    Pop <- Pop[-1,] 
    Pop$Population <- as.numeric(Pop$Population) 
    Pop$ZipCode <- as.character(Pop$ZipCode) 
    Pop$State <- FIPS.table[match(Pop$FIPS, FIPS.table$FI), "St"] # match states 
Pop <- Pop[,c("State","ZipCode","Population")] 
    return(Pop) 
} 

## Example, now passing any of the following should work 
res <- StatePop1('KY') 
res <- StatePop1(c('NH','KY')) 
res <- StatePop1('All') 
+0

這很好。感謝jsonlite的領導,速度要快得多。我知道我需要使用樂器,只是不知道如何融入它。如果有人試圖運行這個代碼,只要確保你安裝了正確的軟件包並設置了選項(max.print = big#),以便打印所有內容。 – SuperCereal