Зацикливание функции над уникальными идентификаторами и добавление результата в data.frame - PullRequest
0 голосов
/ 28 октября 2018

Я пытаюсь «зациклить» функцию (то есть функцию getComtrade () , написанную Стефаном Ангриком) над списком уникальных идентификаторов страны, а затем добавить результат в большой `data.frame 'объект для будущего использования.Задача может быть разбита на следующие шаги:

  1. цикл по уникальному идентификатору страны в country_code (в цифрах)
  2. извлечение двусторонних торговых потоков каждого идентификатора с остальным миромв конкретном году, используя get.Comtrade() -> d
  3. для каждого идентификатора (i), поднабор соответствующих столбцов из d
  4. и добавление поднабора результатов из шага 3 кбольшой кадр данных -> df_total

Вот что я получил до сих пор:

###connect to UN Comtrade data###
library(rjson)
string <- "http://comtrade.un.org/data/cache/partnerAreas.json"
reporters <- fromJSON(file=string)
reporters <- as.data.frame(t(sapply(reporters$results,rbind)))

###get WTO member comtrade code reference list (source from my own list)###

library(foreign)
### from my own Dropbox folder ###
link <- "https://www.dropbox.com/s/8cihsafxab5riep/tariff_rates.csv?dl=1"
dat <- read.csv(link)

### subsetting a list of eligible countries from dat ###
inds <- subset(reporters, reporters$V1 %in% dat[,3])

### require Stefan Angrick's get.Comtrade() function###
install.packages("comtrade.tar.gz", repos = NULL, type = "source")
library(comtrade)

country_code <- as.numeric(unlist(inds[,1]))
df_total = data.frame()

## step 1 ##
for (i in unique(country_code)){
  ## step 2 ##
  d <- get.Comtrade(r=toString(i), p="all", ps="2006", type="C", rg="2", freq="A")
  df <- data.frame(d$data)
  ## step 3 ##
  df <- cbind(d$data[2], d$data[10], d$data[13], d$data[32])
  ## step 4 ##
  df_total <- rbind(df_total,df)
  }
  
df_total

Но результат показывает 409 Conflict

Error in file(con, "r") : cannot open the connection
In addition: Warning message:
In file(con, "r") :
  cannot open URL 'http://comtrade.un.org/api/get?max=50000&type=C&freq=A&px=HS&ps=2006&r=558&p=all&rg=2&cc=TOTAL&fmt=json': HTTP status was '409 Conflict'

, что может означать, что веб-сервер не может обработать запрошенный объем информации.

В качестве альтернативы я попытался удалить шаги 3 и 4 из for-loop и зацикливание на меньшем подмножестве идентификатора страны вместо этого, но результирующий df всегда с выводом (d) предыдущего идентификатора страны будет записан поверх следующей записи идентификатора страны, так что конечный d всегдабудучи Зимбабве (последняя страна из моего списка стран в алфавитном порядке).

Я задавал аналогичный вопрос в другой форме почти два года назад, но не смог получить никаких существенных ответов.Буду очень признателен, если кто-нибудь сможет пролить свет на это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...