#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:
Вы могли бы достичь желаемого результата следующим образом:
- Первый подход использует
for
. Здесь я сначала инициализирую пустой списокdt
, в который я добавляю данные за отдельные годы. Примечание: Comtrade API возвращает сам список, где данные хранятся в вызываемом элементеdata
. Вместо сохранения всего списка я извлекаю данные через[["data"]]
. - Второй подход будет использовать
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. Большое вам спасибо! Это сработало 🙂