从API

时间:2016-02-18 16:15:19

标签: r api geocoding httr

我正在尝试通过美国人口普查地理编码器对一组地址进行批量地理编码:http://geocoding.geo.census.gov/geocoder/

我发现了这个问题:

Posting to and Receiving data from API using httr in R

并且Hadley的建议完美地将我的数据框发送到API并获取地理编码的地址。我遇到的问题是如何将返回的数据恢复到数据框中。我会对那里的回复发表评论,但不幸的是,由于这是一个新帐户,我暂不予评论。

所以我的代码如下:

req <- POST("http://geocoding.geo.census.gov/geocoder/geographies/addressbatch", 
body = list(
      addressFile = upload_file("mydata.csv"),
      benchmark = "Public_AR_Census2010",
      vintage = "Census2010_Census2010"
 ), 
encode = "multipart",
verbose())
stop_for_status(req)
content(req)

当我运行内容(req)时,我得到的数据如下:

"946\",\"123 MY STREET, ANYTOWN, TX,
99999\",\"Match\",\"Non_Exact\",\"123 MY STREET, ANYTOWN, TX,
99999\",\"-75.43486,80.423775\",\"95495654\",\"L\",\"99\",\"999\",\"021999\",\"3
005\"\n\"333\",\"456 MY STREET, ANYTOWN, TX, 
99999\",\"Match\",\"Exact\",\"456 MY STREET, ANYTOWN, TX, 
99999\",\"-75.38545,80.383747\",\"6546542\",\"R\",\"99\",\"999\",\"021999\",\"3002\"\n\

我尝试过使用这里提到的jsonlite方法:Successfully coercing paginated JSON object to R dataframe

以及谷歌搜索httr /内容到数据框架,并没有任何运气。我最接近获得我想要的是使用

cat(content(req, "text"), "\n")获得的结果看起来像我可以用作数据框的CSV:

"476","123 MY STREET, ANYTOWN, TX, 99999","Match","Exact",
"123 MY STREET, ANYTOWN, TX,
99999","-75.438644,80.426025","654651321","L","99","999","0219999","3013"

但我也无法找到任何有关将cat()的结果导入数据框的帮助,因为我相信该函数只打印结果。

当我使用浏览器并上传csv时,我得到一个包含以下列的csv: RowID,地址,匹配,MatchType,MatchedAddress,Lat,Long,StreetSide,State,County,Tract,Block

我更喜欢通过R执行此操作,因此我的最终结果需要是包含这些列的数据框。数据存在于内容(req)中,我还没弄清楚如何在数据框中获取数据。

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

使用textConnection使其成为一个班轮

df <- read.csv(textConnection(content(req, 'text')))

答案 1 :(得分:1)

也许现在超过6个月后,这个问题已经解决了。但如果其他人有同样的问题:

问题是您在变量列表中缺少列标题,并且您有两个列标题用于坐标。并且您不能使用人口普查局提供的那些,因为它们没有为所有变量提供完整的标题行。首先将输出发送到CSV文件:

cat(content(req, "text"), file="reqoutput.csv")

然后将其作为数据帧读回来,提供您自己的标题行:

reqdata<-read.csv(file="reqoutput.csv", skip=1,
                  col.names = c('RowID', 'Address', 'Match', 'MatchType',
                                'MatchedAddress', 'LongLat', 'thing',
                                'Streetside', 'State', 'County', 'Tract',                
                                'Block'))

在您的示例输出中,请注意人口普查局将坐标作为双引号中的一个字段提供,并且它的经度后跟纬度。

坐标后,有一个九位数字的数字,我不知道那是什么。我打电话给它&#39;事情&#39;。