Census 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()関数はリストオブジェクトを作成します。ほとんどの場合、リストオブジェクトの要素は、各空間単位(例えば、上記の例ではcounty)の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]
は誰もいこのための解決策がありますか?
- サブリストは、変数の1つがNULL値を持つ場合にのみ表示されることに気付きました。
- メインリストの要素もリストである場合、サブリストの長さは、ベクトルであるメインリストの要素のベクトルの長さに等しくなります。私はfromJSONと、これは簡単になるかもしれない歓迎代替手段を使用する必要はありません
ノート
- 。
- これを達成するために 'acs'パッケージを使用したくないので、その使用を提案しないでください。私はこの問題に対処する方法を学ぼうとしています。
'as.data.frame(do。コール(cbind、l2)) 'は典型的なものです(ただし、偉大ではありませんが、タイプを失うでしょう)。 'purrr'はリストを扱うのに便利です。あなたは 'l2%> setNames(make.names(seq_along()))%>%at_depth(2、〜.x%||%NA)%>%map_df(unlist)'のようなことをすることができます。最も優雅なバージョンではありません。 – alistaire