我正在编写一个循环来提取每个国家/地区(例如国家/地区)的UN Comtrade导出数据,并将按国家/地区将其导出为单独的CSV文件以供日后使用。所以我使用“get.Comtrade”函数(由Stefan a。编写)作为起点,并通过Comtrade数据中的每个唯一的3位数国家代码循环。另外,我只对获取“商品”“出口”数据感兴趣(从国家i到任何其他国家),并且对使用get.Comtrade功能提取的“列表”中包含的所有其他信息没有用处,所以我只会提取每个国家的“年份”,“记者”,“合作伙伴”和“交易价值”数据,并将它们组合成CSV表格。
为了举例说明,我在2006年以美国(国家代码= 842)开头,所以我写了
d <- get.Comtrade(r="842", p="all", ps="2006", type="C", rg="2", freq="A")
给了我一个“列表” - &gt; d包含2个项目“验证”和“数据”,其中后者(数据)包含35个变量并且是感兴趣的数据框。但是,我只需要以下信息(作为列号的索引):
[2]年,[10] rtTitle = Reporter,[13] ptTitle = Partner,[32] Trade.Value..US ..
所以我进入了
df <- cbind(d$data[2], d$data[10], d$data[13], d$data[32])
制作一个较小的数据框,并按百万美元调整“交易价值”。
df$million <- as.numeric(as.character(df[,4]))/1000000
最后,我将其导出到CSV文件到指定的工作目录
write.table(df, "~/working directory/data.csv", na = "NA", row.names = FALSE, col.names = TRUE, sep=",")
这很简单,确实给了我一个四列的CSV表格。基于这种简单的格式,我继续编写一个循环来获取每个国家的CSV输出:
for (i in 1:length(country_list)){
d <- get.Comtrade(r="i", p="all", ps="2006", type="C", rg="2", freq="A")
df <- cbind(d$data[2], d$data[10], d$data[13], d$data[32])
df$million <- as.numeric(as.character(df[,4]))/1000000
myfile <- file.path("~/working directory", paste0("_", i, ".csv"))
write.table(df, file=myfile, na = "NA", row.names = FALSE, col.names = FALSE, quote=FALSE, append=FALSE, sep="")
}
但它会返回一条错误消息,说明
Error in [.data.frame(d$data, 2) : undefined columns selected
表示在循环的第二行发生错误,即d$data
中的列为undefined
。因此,我在此板上检查了与列表和/或数据框格式中的列名称问题相关的先前问题,尝试了三天不同的方法,但仍然无法找到解决此问题的方法。
我知道这应该是一个非常简单的循环,但我只是陷入困境。
你们对此有什么看法?如果有人能够指出“未定义列”问题中的错误,我们将非常感激,因为到目前为止,我已经检查了许多早期线程中的错误。
谢谢。
但顺便说一下,
为了执行上面的代码,需要Stefan A.的get.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,"&" #maximum no. of records returned
,"type=",type,"&" #type of trade (c=commodities)
,"freq=",freq,"&" #frequency
,"px=",px,"&" #classification
,"ps=",ps,"&" #time period
,"r=",r,"&" #reporting area
,"p=",p,"&" #partner country
,"rg=",rg,"&" #trade flow
,"cc=",cc,"&" #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))
}
}
}
从
获取记者名单library(rjson)
string <- "http://comtrade.un.org/data/cache/partnerAreas.json"
reporters <- fromJSON(file=string)
reporters <- as.data.frame(t(sapply(reporters$results,rbind)))