0

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

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

我尝试将它们加载到 R 中并使用以下代码将它们转换为数据框:(在链接中,我将所有区域的列表替换为“ALL”,否则链接将长达六页)

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 Bad request”错误。

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

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)

我还尝试使用“OECD”包来获取数据。在那里我遇到了同样的问题。(“400 错误请求”)

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) 

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

df <- get_dataset("FTPTC_D", filter = "FRA+USA", pre_formatted = TRUE)

有谁知道我的错误可能在哪里?

4

1 回答 1

2

sdmx-ml api 似乎不像解释的那样工作(使用 all 参数),而 json API 工作得很好。以下查询返回所有国家/地区的值并将它们作为 json 返回 - 我只是将 All 替换为一个空字段。

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?

将其转换为可读格式并非易事。我玩了一下以找到以下解决方法:

# 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

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

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

最后,您想了解密钥。那些隐藏在“结构”中。这个你还需要正确解析,所以我写了一个函数让你更容易提取值和 id:

## 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))

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

最好的,托拜厄斯

于 2020-01-03T20:07:37.763 回答