在唯一ID上循环功能,然后将结果附加到data.frame

时间:2018-10-28 16:19:25

标签: r for-loop dataframe append

我正在尝试在唯一国家/地区ID列表上“循环”一个函数(例如,由Stefan Angrick编写的getComtrade()函数),然后将结果附加到大的“ data.frame”中对象以备将来使用。 该任务可以分解为以下步骤:

  1. 循环浏览country_code中的唯一国家/地区ID(以数字表示)
  2. 使用get.Comtrade()-> d
  3. 提取给定年份中每个id与世界其他地区的双边贸易流量。
  4. 对于每个ID(i),来自d的子集相关列
  5. 将第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'

这可能意味着Web服务器无法处理我请求的信息量。

或者,我尝试从for-loop中删除第3步和第4步,并循环遍历国家ID的较小子集,但是结果df始终具有输出(d )的上一个国家/地区ID由下一个国家/地区ID覆盖,因此最后一个d始终是津巴布韦(我的国家/地区列表中的最后一个国家(按字母顺序)。

近两年前,我在different form问过类似的问题,但没有收到任何实质性答复。如果有人能对此有所启发,我将不胜感激。

0 个答案:

没有答案