首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过SDMX(XML)将经合组织的数据提取到R中

通过SDMX(XML)将经合组织的数据提取到R中
EN

Stack Overflow用户
提问于 2019-12-30 10:10:45
回答 1查看 798关注 0票数 0

我想特别地从经合组织网站中提取数据集"REGION_ECONOM“,其维度为"GDP”(各区域的GDP)和"POP_AVG“(各区域的平均人口)。

这是我第一次这样做:我在OECD网站上选择了所有所需的维度,并复制了SDMX (XML)链接。

我试图将它们加载到R中,并使用以下代码将它们转换为数据帧:(在链接中,我用" all“替换了所有区域的列表,否则链接将长达6页)

代码语言:javascript
复制
if (!require(rsdmx)) install.packages('rsdmx') + library(rsdmx)

    url2 <- "https://stats.oecd.org/restsdmx/sdmx.ashx/GetData/REGION_ECONOM/1+2.ALL.SNA_2008.GDP+POP_AVG.REAL_PPP.ALL.1990+1991+1992+1993+1994+1995+1996+1997+1998+1999+2000+2001+2002+2003+2004+2005+2006+2007+2008+2009+2010+2011+2012+2013+2014+2015+2016+2017+2018/all?"
    sdmx2 <- readSDMX(url2)
    stats2 <- as.data.frame(sdmx2)
    head(stats2)

不幸的是,这会返回一个"400坏请求“错误。

仅选择几个区域时,就不会出现错误:

代码语言:javascript
复制
if (!require(rsdmx)) install.packages('rsdmx') + library(rsdmx)

    url1 <- "https://stats.oecd.org/restsdmx/sdmx.ashx/GetData/REGION_ECONOM/1+2.AUS+AU1+AU101+AU103+AU104+AU105.SNA_2008.GDP+POP_AVG.REAL_PPP.ALL.1990+1991+1992+1993+1994+1995+1996+1997+1998+1999+2000+2001+2002+2003+2004+2005+2006+2007+2008+2009+2010+2011+2012+2013+2014+2015+2016+2017+2018/all?"
    sdmx1 <- readSDMX(url1)
    stats1 <- as.data.frame(sdmx1)
    head(stats1)

我还试图使用“经合组织”一揽子计划来获取数据。我也有同样的问题。("400不良请求“)

代码语言:javascript
复制
if (!require(OECD)) install.packages('OECD') + library(OECD)

df1<-get_dataset("REGION_ECONOM", filter = "GDP+POP_AVG", 
             start_time = 2008, end_time = 2009, pre_formatted = TRUE) 

但是,当我将该包用于其他数据集时,它确实有效:

代码语言:javascript
复制
df <- get_dataset("FTPTC_D", filter = "FRA+USA", pre_formatted = TRUE)

有人知道我的错误在哪里吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-03 20:07:37

sdmx-ml似乎不像解释的那样工作(使用all参数),而json工作得很好。下面的查询返回所有国家的值,并以json的形式返回--我只是用一个空字段替换了所有值。

代码语言:javascript
复制
query <- https://stats.oecd.org/sdmx-json/data/REGION_ECONOM/1+2..SNA_2008.GDP+POP_AVG.REAL_PPP.ALL.1990+1991+1992+1993+1994+1995+1996+1997+1998+1999+2000+2001+2002+2003+2004+2005+2006+2007+2008+2009+2010+2011+2012+2013+2014+2015+2016+2017+2018/all?

将其转换为可读的格式并不是那么简单。为了找到下面的解决办法,我玩了一会儿:

代码语言:javascript
复制
# send a GET request using httr
library(httr)

query <- "https://stats.oecd.org/sdmx-json/data/REGION_ECONOM/1+2..SNA_2008.GDP+POP_AVG.REAL_PPP.ALL.1990+1991+1992+1993+1994+1995+1996+1997+1998+1999+2000+2001+2002+2003+2004+2005+2006+2007+2008+2009+2010+2011+2012+2013+2014+2015+2016+2017+2018/all?"
dat_raw <- GET(query)
dat_parsed <- parse_json(content(dat_raw, "text"))  # parse the content

接下来,访问嵌套列表中的观察,并将它们转换为矩阵。还从键中提取特征:

代码语言:javascript
复制
dat_obs <- dat_parsed[["dataSets"]][[1]][["observations"]]
dat0 <- do.call(rbind, dat_obs)  # get a matrix
new_features <- matrix(as.numeric(do.call(rbind, strsplit(rownames(dat0), ":"))), nrow = nrow(dat0))
dat1 <- cbind(new_features, dat0)  # add feature columns
dat1_df <- as.data.frame(dat1)  # optionally transform to data frame

最后你想知道钥匙的事。这些都隐藏在“结构”中。您还需要正确解析这个函数,因此我编写了一个函数,以便更容易地提取值和ids:

代码语言:javascript
复制
## Get keys of features
keys <- dat_parsed[["structure"]][["dimensions"]][["observation"]]
for (i in 1:length(keys)) print(paste("id position:", i, "is feature", keys[[i]]$id))

# apply keys
get_features <- function(data_input, keys_input, feature_index, value = FALSE) {
  keys_temp <- keys_input[[feature_index]]$values
  keys_temp_matrix <- do.call(rbind, keys_temp)
  keys_temp_out <- keys_temp_matrix[, value + 1][unlist(data_input[, feature_index])+1]  # column 1 is id, 2 is value
  return(unlist(keys_temp_out))
}

head(get_features(dat1_df, keys, 7))
head(get_features(dat1_df, keys, 2, value = FALSE))
head(get_features(dat1_df, keys, 2, value = TRUE))

我希望这对你的项目有帮助。

最好,托拜厄斯

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59529074

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档