Как извлечь данные из API Comtrade ООН с помощью цикла?

#r #loops #for-loop

Вопрос:

Я очень новичок в R Studio, и я пытаюсь создать цикл для импорта данных из UN comtrade, поскольку я могу импортировать только ограниченное количество наблюдений в каждом вызове.

Я использую следующую функцию для получения моих данных за один год (в данном случае за 2006 год):

 dt06 <- get.Comtrade(r="all", p="0", ps="2006", 
                    rg=2, cc="0,1,24,25,5,54,63,64,67,69,71,72,73,74,75,76,764", fmt="csv")
dt06df<- as.data.frame(do.call(rbind, dt06))
 

Я хочу выполнить тот же импорт за 2000-2020 годы, следовательно, повторить код:

 dt07 <- get.Comtrade(r="all", p="0", ps="2007", 
                    rg=2, cc="0,1,24,25,5,54,63,64,67,69,71,72,73,74,75,76,764", fmt="csv")
dt07df <- as.data.frame(do.call(rbind, dt07))

dt20 <- get.Comtrade(r="all", p="0", ps="2020", 
                     rg=2, cc="0,1,24,25,5,54,63,64,67,69,71,72,73,74,75,76,764", fmt="csv")
dt20df <- as.data.frame(do.call(rbind, dt20))
 

А затем объединить мои данные в одну матрицу

 data <- rbind(dt07df,dt06df, dt20df)
 

Я никогда раньше не создавал цикл в R и задавался вопросом, является ли более эффективным / возможным использование цикла repeat или for?

Может ли кто-нибудь помочь мне начать?

введите описание изображения здесь

Ответ №1:

Вы могли бы достичь желаемого результата следующим образом:

  1. Первый подход использует for . Здесь я сначала инициализирую пустой список dt , в который я добавляю данные за отдельные годы. Примечание: Comtrade API возвращает сам список, где данные хранятся в вызываемом элементе data . Вместо сохранения всего списка я извлекаю данные через [["data"]] .
  2. Второй подход будет использовать lapply более элегантный и, возможно, более простой способ выполнения цикла.

В любом случае вы получаете список фреймов данных, которые затем можно связать вместе, используя do.call(rbind, dt) .

 library(rjson)

years <- 2006:2007
dt <- list()
for (i in seq_along(years)) {
  dt[[i]] <- get.Comtrade(r="all", p="0", ps = years[i], 
               rg=2, cc="0,1,24,25,5,54,63,64,67,69,71,72,73,74,75,76,764", fmt="csv")[["data"]]
}
dt_bind <- do.call(rbind, dt)

# via lapply

dt <- lapply(years, function(x) {
  get.Comtrade(r="all", p="0", ps = x, 
                    rg=2, cc="0,1,24,25,5,54,63,64,67,69,71,72,73,74,75,76,764", fmt="csv")[["data"]]
})
dt_bind <- do.call(rbind, dt)

# Result
head(dt_bind, n = 5)
#>   Classification Year Period Period.Desc. Aggregate.Level Is.Leaf.Code
#> 1             H2 2006   2006         2006               2            0
#> 2             H2 2006   2006         2006               2            0
#> 3             H2 2006   2006         2006               2            0
#> 4             H2 2006   2006         2006               2            0
#> 5             H2 2006   2006         2006               2            0
#>   Trade.Flow.Code Trade.Flow Reporter.Code   Reporter Reporter.ISO Partner.Code
#> 1               2     Export             8    Albania          ALB            0
#> 2               2     Export            12    Algeria          DZA            0
#> 3               2     Export            20    Andorra          AND            0
#> 4               2     Export            31 Azerbaijan          AZE            0
#> 5               2     Export            32  Argentina          ARG            0
#>   Partner Partner.ISO X2nd.Partner.Code X2nd.Partner X2nd.Partner.ISO
#> 1   World         WLD                NA           NA               NA
#> 2   World         WLD                NA           NA               NA
#> 3   World         WLD                NA           NA               NA
#> 4   World         WLD                NA           NA               NA
#> 5   World         WLD                NA           NA               NA
#>   Customs.Proc..Code Customs Mode.of.Transport.Code Mode.of.Transport
#> 1                 NA      NA                     NA                NA
#> 2                 NA      NA                     NA                NA
#> 3                 NA      NA                     NA                NA
#> 4                 NA      NA                     NA                NA
#> 5                 NA      NA                     NA                NA
#>   Commodity.Code                                    Commodity Qty.Unit.Code
#> 1             24 Tobacco and manufactured tobacco substitutes             1
#> 2             24 Tobacco and manufactured tobacco substitutes             1
#> 3             24 Tobacco and manufactured tobacco substitutes             1
#> 4             24 Tobacco and manufactured tobacco substitutes             1
#> 5             24 Tobacco and manufactured tobacco substitutes             1
#>      Qty.Unit Qty Alt.Qty.Unit.Code Alt.Qty.Unit Alt.Qty Netweight..kg.
#> 1 No Quantity  NA                NA           NA      NA             NA
#> 2 No Quantity  NA                NA           NA      NA             NA
#> 3 No Quantity  NA                NA           NA      NA             NA
#> 4 No Quantity  NA                NA           NA      NA             NA
#> 5 No Quantity  NA                NA           NA      NA             NA
#>   Gross.weight..kg. Trade.Value..US.. CIF.Trade.Value..US..
#> 1                NA           4166452                    NA
#> 2                NA            214243                    NA
#> 3                NA            261794                    NA
#> 4                NA          19868803                    NA
#> 5                NA         253420990                    NA
#>   FOB.Trade.Value..US.. Flag
#> 1                    NA    0
#> 2                    NA    0
#> 3                    NA    0
#> 4                    NA    0
#> 5                    NA    0
 

getComtrade

Источник: Comtrade

 get.Comtrade <- function(url="http://comtrade.un.org/api/get?"
                         ,maxrec=50000
                         ,type="C"
                         ,freq="A"
                         ,px="HS"
                         ,ps="now"
                         ,r
                         ,p
                         ,rg="all"
                         ,cc="TOTAL"
                         ,fmt="json"
)
{
  string<- paste(url
                 ,"max=",maxrec,"amp;" #maximum no. of records returned
                 ,"type=",type,"amp;" #type of trade (c=commodities)
                 ,"freq=",freq,"amp;" #frequency
                 ,"px=",px,"amp;" #classification
                 ,"ps=",ps,"amp;" #time period
                 ,"r=",r,"amp;" #reporting area
                 ,"p=",p,"amp;" #partner country
                 ,"rg=",rg,"amp;" #trade flow
                 ,"cc=",cc,"amp;" #classification code
                 ,"fmt=",fmt        #Format
                 ,sep = ""
  )
  
  if(fmt == "csv") {
    raw.data<- read.csv(string,header=TRUE)
    return(list(validation=NULL, data=raw.data))
  } else {
    if(fmt == "json" ) {
      raw.data<- fromJSON(file=string)
      data<- raw.data$dataset
      validation<- unlist(raw.data$validation, recursive=TRUE)
      ndata<- NULL
      if(length(data)> 0) {
        var.names<- names(data[[1]])
        data<- as.data.frame(t( sapply(data,rbind)))
        ndata<- NULL
        for(i in 1:ncol(data)){
          data[sapply(data[,i],is.null),i]<- NA
          ndata<- cbind(ndata, unlist(data[,i]))
        }
        ndata<- as.data.frame(ndata)
        colnames(ndata)<- var.names
      }
      return(list(validation=validation,data =ndata))
    }
  }
}
 

Комментарии:

1. Большое вам спасибо! Это сработало 🙂