2015-03-07 2 views
0

Я пытаюсь написать цикл for, который будет принимать почтовые индексы, сделать вызов API в базу данных информации Конгресса, а затем разобрать только стороны конгрессменов, представляющих почтовый индекс.Разбор JSON в цикле for в R

Проблема заключается в том, что некоторые из почтовых индексов имеют более одного конгрессмена, а другие вообще не имеют (по всей видимости, ошибка со стороны базы данных). Это означает, что мне нужно прокрутить счет, возвращенный оригинальным нажатием, пока не появится больше представителей.

Вопрос в том, что количество конгрессменов, представляющих каждый почтовый индекс, отличается. Таким образом, я хотел бы иметь возможность записывать новые имена переменных в мою фреймворк для каждого нового конгрессмена. То есть, если есть 2 конгрессмена, я бы хотел написать новые колонки с именем «party.1» и «party.2» и т. Д.

У меня есть этот код, и я чувствую, что я близок , но я действительно зациклился на том, что делать дальше. Спасибо за вашу помощь!

EDIT: Я нашел этот способ быть проще, но я до сих пор не получаю результаты я ищу

library(rjson) 
library(RCurl) 

zips <- (c("10001","92037","90801", "94011") 

test <- matrix(nrow=4,ncol=7) 
temp <- NULL 
tst <- NULL 

for (i in 1:length(zips)) { 
    for (n in length(temp$count)) { 
     temp <- (fromJSON(getURL(paste('https://congress.api.sunlightfoundation.com/legislators/locate?zip=', 
           zips[i],'&apikey= 'INSERT YOUR API KEY', sep=""), .opts = list(ssl.verifypeer = FALSE)))) 
    tst <- try(temp$results[[n]]$party, silent=T) 
     if(is(tst,"try-error")) 
     test[i,n] <- NA 
     else 
     test[i,n] <- (temp$results[[n]]$party) 
    } 
} 
+1

Я поддерживаю клиент R для API Sunlight. Https://github.com/ropengov/rsunlight – sckott

+0

Спасибо Скотту, но есть ли способ сделать это в цикле? Мне нужно перенести результаты в кадр данных, и я немного потерял, как это сделать с вашим клиентом. – StanO

+0

Я не уверен, что вы имеете в виду, перейдя к data.frame. Вывод в слоте 'results' представляет собой data.frame, если на самом деле есть данные для этого почтового индекса. Просто проиндексируйте «результаты», чтобы получить data.frame. – sckott

ответ

3
install.packages("rsunlight") 
library("rsunlight") 
zips <- c("10001","92037","90801", "94011") 
out <- lapply(zips, function(z) cg_legislators(zip = z)) 
# results for some only 
sapply(out, "[[", "count") 
# peek at results for one zip code 
head(out[[1]]$results[,1:4]) 

bioguide_id birthday chamber             contact_form 
1  S000148 1950-11-23 senate   http://www.schumer.senate.gov/Contact/contact_chuck.cfm 
2  N000002 1947-06-13 house https://jerroldnadler.house.gov/forms/writeyourrep/default.aspx 
3  M000087 1946-02-19 house     https://maloney.house.gov/contact-me/email-me 
4  G000555 1966-12-09 senate      http://www.gillibrand.senate.gov/contact/ 

Вы можете изменить при необходимости в lapply или цикл для добавить столбцы и т. д.

Чтобы вытащить партию, можно было бы просто: lapply(zips, function(z) cg_legislators(zip = z)$results$party).

Смежные вопросы