我正在尝试通过美国人口普查地理编码器对一组地址进行批量地理编码:http://geocoding.geo.census.gov/geocoder/
我发现了这个问题:
在R 中使用 httr 发布到 API 并从 API 接收数据
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 方法:成功将分页的 JSON 对象强制到 R 数据帧
以及谷歌搜索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:行ID, 地址, 匹配, 匹配类型, 匹配地址, 纬度, 长, 街边, 州, 县, 区域, 块
我更愿意通过 R 执行此操作,因此我的最终结果需要是包含这些列的数据框。数据在内容(req)中,我只是还没有弄清楚如何在数据框中获取它。
感谢您的帮助!
使用 textConnection 使其成为一行
df <- read.csv(textConnection(content(req, 'text')))
也许现在 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'))
在示例输出中,请注意,人口普查局以双引号为单位将坐标作为一个字段提供,并且它是经度后跟纬度。
坐标后面,有一串九位数的数字,我不知道那是什么。我称之为"东西"。