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]
사람을합니까 이것에 대한 해결책이 있습니까?
- 변수 중 하나에 NULL 값이있는 경우에만 하위 목록이 표시됩니다. 메인리스트의 요소는리스트 인 경우
- 는 서브리스트 벡터이다 메인리스트의 요소 벡터의 길이와 동일한 길이이다.
참고
- 나는 fromJSON이 쉽게 만들 수 환영 대안을 사용할 필요가 없습니다.
- 이 작업을 수행하기 위해 'acs'패키지를 사용하고 싶지 않으므로 사용을 제안하지 마십시오. 나는이 문제를 다루는 방법을 배우려고 노력하고있다.이
simplify2array(l2)
편집 :
이위의 솔루션은 작동하지 않았다
'as.data.frame (do.call (cbind, l2))'는 전형적 일 것입니다 (그러나 위대하지는 않지만, 타입을 잃을 것입니다). 'purrr'은리스트를 다루는데 유용합니다; 당신은'l2 %> setNames (make.names (seq_along (.)))> % at_depth (2, ~ .x % || % NA) %> % map_df (unlist)'같은 것을 할 수있다. 가장 우아한 버전은 아닙니다. – alistaire