【问题标题】:R httr content(req) to data frame after receiving data from API从API接收数据后R httr content(req)到数据帧
【发布时间】:2016-02-18 16:15:19
【问题描述】:

我正在尝试通过美国人口普查地理编码器对一组地址进行批量地理编码: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)

当我运行 content(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/content 谷歌搜索到数据框,但没有任何运气。我最接近得到我想要的东西是使用

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、Country、Tract、Block

我更愿意通过 R 来完成这一切,所以我的最终结果需要是一个包含这些列的数据框。数据在 content(req) 中,我只是还没弄清楚如何在数据框中获取它。

感谢您的帮助!

【问题讨论】:

    标签: r api geocoding httr


    【解决方案1】:

    使用 textConnection 使其成为一条线

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

    【讨论】:

    • 现在read.csv 也有一个text= 属性,因此您可以使用df &lt;- read.csv(text=content(req, 'text')) 并避免显式创建textConnection()
    【解决方案2】:

    也许现在 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'))
    

    在您的示例输出中,请注意人口普查局以双引号中的一个字段的形式提供坐标,它是经度,后跟纬度。

    坐标后面是一串九位数的数字,不知道是什么。我称它为“东西”。

    【讨论】:

      猜你喜欢
      • 2023-03-10
      • 2017-06-27
      • 1970-01-01
      • 1970-01-01
      • 2020-02-29
      • 2019-01-03
      • 1970-01-01
      • 2019-11-05
      • 1970-01-01
      相关资源
      最近更新 更多