0

我正在尝试从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.framedata.tabletibble格式)应包含以下列 yearreporterpartnerproduct codetariff 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)

4

0 回答 0