我正在嘗試使用人口普查API下載特定表並將它們保存在數據框中。我已成功下載數據。我爲呼叫組裝適當的URL,然後使用包'rjson'將URL讀入列表。例如:R:將列表轉換爲數據框(人口普查數據)
library(rjson)
get <- c("B19081_002M") # create vector of vars
datafile <- "http://api.census.gov/data/2009/acs5?" # ACS 05-09
get <- paste0("get=NAME,", paste(get, collapse = ',')) # variables
geo <- "for=county:*" # all counties
api_key <- "key=KEYHERE" # API key
url <- paste0(datafile, paste(get, geo, api_key, sep = "&")) # creates url
data <- fromJSON(file = url) # read into R
# To see an example of a problematic observation
# (this should return "Hinsdale County, Colorado")
data[[273]]
但是,我很難將其轉換爲數據幀。 fromJSON()函數創建一個列表對象。在大多數情況下,列表對象的元素是每個空間單元的chr向量(例如上例中的縣),矢量包含表格信息和相關的元數據。在這種情況下,我使用下面的工作示例中的方法將列表轉換爲數據框,其中每行是不同的空間單位,每列是不同的變量。
# Create fake data
x1 <- seq(1:5)
x2 <- rep(5,5)
l1 <- list(x1,x2)
# Convert to df
cols_per_row <- length(unlist(l1[1]))
test1 <- data.frame(matrix(unlist(l1), byrow = TRUE, ncol = cols_per_row))
print(test1) # success!
X1 X2 X3 X4 X5
1 1 2 3 4 5
2 5 5 5 5 5
但是當我使用的是與列表中的列表對象(其產生是因爲我,包括從API不同的表)同樣的方法,我收到一個錯誤:
# Create fake data
x1 <- seq(1:5)
x2 <- rep(5,5)
x3 <- list(1,2,3,4,NULL)
l2 <- list(x1,x2,x3)
# Produces an error
cols_per_row <- length(unlist(l2[1]))
test2 <- data.frame(matrix(unlist(l2), byrow = TRUE, ncol = cols_per_row))
Warning message:
In matrix(unlist(l2), byrow = TRUE, ncol = cols_per_row) :
data length [14] is not a sub-multiple or multiple of the number of columns [5]
有誰有這個解決方案嗎?
- 我注意到子列表只出現在其中一個變量具有NULL值的情況下。
- 在主列表的元素也是列表的情況下,子列表的長度等於作爲向量的主列表元素的向量的長度。
注意
- 我並不需要使用fromJSON和歡迎的替代品,可能使這更容易。
- 我不想用'acs'包來實現這個功能,所以請不要使用它。我正在努力學習如何處理這個問題。
'as.data.frame(do。call(cbind,l2))'是一種典型的(雖然不是很好,你會失去類型)。 'purrr'對處理列表很有用;你可以做一些像'l2%>%setNames(make.names(seq_along(。)))%>%at_depth(2,〜.x%||%NA)%>%map_df(unlist)',儘管這可能不是最優美的版本。 – alistaire