我正在尝试从UNCTAD WITS 数据库中汇编所有年份的双边(国家对国家)关税税率数据。他们的数据目前以 HTML 和 SDMX 格式提供,这需要请求者使用 API 来检索数据以进行后处理。我想把它们转换成 R 可读的形式,因此这篇文章。
他们的手册指导用户以这种形式使用 write API 调用“http://wits.worldbank.org/API/V1/SDMX/V21/rest/data/DF_WITS_Tariff_TRAINS/.840.000.020110.reported/?startperiod=2000&endperiod=2000 "
获取一个报告者(840)-一个合作伙伴(000)-一个产品(020110)-一年(2000)报告的关税税率数据或“http://wits.worldbank.org/API/V1/SDMX/V21/rest /data/DF_WITS_Tariff_TRAINS/.840.000..reported/?startperiod=2000&endperiod=2000”对于一个报告者(2000)-一个合作伙伴(000)-所有产品(.)-一年(2000)报告的关税税率或“http:// /wits.worldbank.org/API/V1/SDMX/V21/rest/data/DF_WITS_Tariff_TRAINS/..000.020110.reported/?startperiod=2000&endperiod=2000" 对于所有报告人 (.)-一个合作伙伴 (000)-一个产品 ( 020110)-一年92000)上报关税税率数据
等等等等。
所以我想编写一个 API 调用来获取所有记者 (.) - 所有合作伙伴 (.) - 所有产品 (.) - 一年的数据,所以我想代码应该看起来像 http://wits.worldbank.org /API/V1/SDMX/V21/rest/data/DF_WITS_Tariff_TRAINS/......reported/?startperiod=2000&endperiod=2000
我从这篇文章中复制了代码,试图找出它是否也适用于我的目的,但不幸的是,R 返回的数据框有 0 列和 0 行,所以xmlParse()
和getNodeSet()
步骤肯定有问题。
如果有人能指出我这样做的正确方法,我将不胜感激。所需的数据输出(最好采用data.frame
、data.table
或tibble
格式)应包含以下列
year
、reporter
、partner
、product code
、tariff rate (reported tariff rate)
。
我在下面列出了我的代码供您参考。
library(RCurl)
library(XML)
link <-"http://wits.worldbank.org/API/V1/SDMX/V21/rest/data/DF_WITS_Tariff_TRAINS/......reported/?startperiod=2000&endperiod=2000"
# Get data from webpage
data_prices <-getURL(link)
# Parse XML data
xmlfile <-xmlParse(data_prices)
# Get place nodes
places <-getNodeSet(xmlfile, "//Series")
# Get values for each place
values <-lapply(places, function(x){
# Get current place id
pid <-xmlAttrs(x)
# Get values for each gas type for current place
newrows <-lapply(xmlChildren(x), function(y){
# Get type and update time values
attrs <-xmlAttrs(y)
# Get price value
price <-xmlValue(y)
names(price) <-"price"
# Return values
return(c(pid, attrs, price))
})
# Combine rows to single list
newrows <-do.call(rbind, newrows)
# Return rows
return(newrows)
})
# Combine all values into a single dataframe
df <-as.data.frame(do.call(rbind, values), stringsAsFactors= FALSE)