我希望从具有特定纬度经度(1200行)的数据文件中获取准确的阻止FIPS ID。
Latitude Longitude ADT
30.0777 -92.43778 84
30.0788 -92.39427 216
30.07883 -92.39575 185
30.07952 -92.3781 88
30.08025 -92.50803 2025
30.08028 -92.36187 2715
通过拉this API,我可以像这样手动获取Block Geoid2:
<Response xmlns="http://data.fcc.gov/api" status="OK" executionTime="24">
<Block FIPS="220019612003034"/>
<County FIPS="22001" name="Acadia"/>
<State FIPS="22" code="LA" name="Louisiana"/>
</Response>
我使用每个数据点(纬度,经度)的网址创建一个新的.csv:
a <- structure(list(Latitude = c("30.0777", "30.0788", "30.07883", "30.07952", "30.08025", "30.08028"),
Longitude = c("-92.43778", "-92.39427", "-92.39575", "-92.3781", "-92.50803", "-92.36187"),
url= c("http://data.fcc.gov/api/block/2010/find?latitude=30.0777&longitude=-92.43778", "http://data.fcc.gov/api/block/2010/find?latitude=30.0788&longitude=-92.39427",
"http://data.fcc.gov/api/block/2010/find?latitude=30.07883&longitude=-92.39575", "http://data.fcc.gov/api/block/2010/find?latitude=30.07952&longitude=-92.3781",
"http://data.fcc.gov/api/block/2010/find?latitude=30.08025&longitude=-92.50803", "http://data.fcc.gov/api/block/2010/find?latitude=30.08028&longitude=-92.36187")),
.Names = c("Latitude", "Longitude", "url"), row.names = c(NA, -6L), class = "data.frame")
a
Latitude Longitude url
30.0777 -92.43778 http://data.fcc.gov/api/block/2010/find?latitude=30.0777&longitude=-92.43778
30.0788 -92.39427 http://data.fcc.gov/api/block/2010/find?latitude=30.0788&longitude=-92.39427
30.07883 -92.39575 http://data.fcc.gov/api/block/2010/find?latitude=30.07883&longitude=-92.39575
30.07952 -92.3781 http://data.fcc.gov/api/block/2010/find?latitude=30.07952&longitude=-92.3781
30.08025 -92.50803 http://data.fcc.gov/api/block/2010/find?latitude=30.08025&longitude=-92.50803
30.08028 -92.36187 http://data.fcc.gov/api/block/2010/find?latitude=30.08028&longitude=-92.36187
首先,我尝试获取一个特定的网址信息。但是我没有收到网址信息。
url <- "http://data.fcc.gov/api/block/2010/find?latitude=40.0&longitude=-85"
readLines(url)
[1] "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><Response xmlns=\"http://data.fcc.gov/api\" status=\"OK\" executionTime=\"10\"><Block FIPS=\"181770103002004\"/><County FIPS=\"18177\" name=\"Wayne\"/><State FIPS=\"18\" code=\"IN\" name=\"Indiana\"/></Response>"
Warning message:
In readLines(url) :
incomplete final line found on 'http://data.fcc.gov/api/block/2010/find?latitude=40.0&longitude=-85'
最后我想要这样的最后一张桌子。
Latitude Longitude ADT Block_FIPS
30.0777 -92.43778 84 220019603002020
30.0788 -92.39427 216 220019604002099
30.07883 -92.39575 185 220019603003019
30.07952 -92.3781 88 220019602002049
30.08025 -92.50803 2025 220019602003017
30.08028 -92.36187 2715 220019602003062
感谢任何帮助。
答案 0 :(得分:1)
您是否已尝试使用XML包?
以下是使用此套件提取您感兴趣的数量的方法:
library(XML)
url <- "http://data.fcc.gov/api/block/2010/find?latitude=40.0&longitude=-85"
api.call <- xmlInternalTreeParse(url)
xmlAttrs(xmlRoot(api.call)[[1]])
根据您拥有的数据量,您可以循环遍历所有URL并将提取的数据附加到数据集中,也可以编写一个小函数来避免R在循环方面的缓慢。
<强>更新强>
以下是一个快速示例,说明如何在循环中包含上面的代码,以便为数据集中的所有行提取FIPS代码。
a$FIPS <- NA
for (i in 1:nrow(a)) {
api.call <- xmlInternalTreeParse(a$url[i])
a$FIPS[i] <- return(xmlAttrs(xmlRoot(api.call)[[1]]))
}
这与函数完全相同(将一个URL值作为输入):
get.fips <- function(url) {
api.call <- xmlInternalTreeParse(url)
return(xmlAttrs(xmlRoot(api.call)[[1]]))
}
# example: get.fips(a$url[1])