Заполнение пропущенных значений из импортированных данных API
Я использую API для получения данных из Бюро переписей. Хорошей новостью является то, что я могу получить данные. Плохая новость заключается в том, что я не могу перевести его в формат, пригодный для анализа и картирования.
Мой вопрос: есть ли способ изменить вызов API или стандартный способ обработки пропущенных значений, когда данные находятся в списке?
Вот что я делаю с фактическими данными. Ниже приведен игрушечный пример, поскольку для данных переписи требуется личный токен API.
# Pull data from Census Bureau
mydata<-fromJSON(file=url(paste("http://api.census.gov/data/2010/acs5?key=", token,"&get=B25077_001E&for=block+group:*&in=state:47+county:037", sep = "")))
# create a data frame
mydata.df<-ldply(mydata)
# rename columns
names(mydata.df)<-ldply(mydata)[1,]
Вот некоторые из моих данных. Я пробовал mydata[mydata == NULL] = 9999, но это не помогло.
list(c("94400", "47", "037", "019200", "4"), c("350000", "47", "037", "019300", "1"), list(NULL, "47", "037", "019300", "2"), list(NULL, "47", "037", "019300", "3"), c("198200", "47", "037", "019400", "1"), c("176900", "47", "037", "019400", "2"), c("250000", "47", "037", "019400", "3"), c("166200", "47", "037", "019500", "1"), c("227200", "47", "037", "019500", "2"), c("210500", "47", "037", "019500", "3"), c("187500", "47", "037", "019500", "4"), c("140000", "47", "037", "019600", "1"), c("131300", "47", "037", "019600", "2"), list(NULL, "47", "037", "980100", "1"), list(NULL, "47", "037", "980200", "1"))
Вот как я знаю, что пропущенные значения; некоторые имеют 5 значений, некоторые имеют 4.
unlist(lapply(mydata, function(x) length(unlist(x))))
Если это не проблема с fromJSON(), вот пример того, что я хотел бы, чтобы данные делали, когда они находятся в R.
mylist = list(a = c(1:4), b = c(1:3), c = c(1:4), d = )
Дает это:
$a
[1] 1 2 3 4
$b
[1] 1 2 3
$c
[1] 1 2 3 4
Но я хотел бы это:
$a
[1] 1 2 3 4
$b
[1] 1 2 3 NA
$c
[1] 1 2 3 4
Или что-то подобное, когда NA действует как заполнитель для пропущенных значений. Например, если отсутствует 2, запись в списке будет выглядеть как 1 NA 3 4.
1 ответ
mylist = list(a = 1:4, b = 1:3, c = c(1,3,4))
Un <- unique(unlist(mylist))
lapply(mylist, function(x) x[match(Un,x)])
# $a
# [1] 1 2 3 4
# $b
# [1] 1 2 3 NA
# $c
#[1] 1 NA 3 4
Обновить
С использованием dput()
данные
lst1 <- lapply(mylist, function(x) do.call(c,lapply(x,
function(y) {y[is.null(y)] <- NA;y})))
head(lst1,3)
#[[1]]
#[1] "94400" "47" "037" "019200" "4"
#[[2]]
#[1] "350000" "47" "037" "019300" "1"
#[[3]]
#[1] NA "47" "037" "019300" "2"