我想在大型数据集中进行一些特定的计算。
这是我使用API调用的MWE(仅下载3-4秒)
devtools::install_github('mingjerli/IMFData')
library(IMFData)
fdi_asst <- c("BFDA_BP6_USD","BFDAD_BP6_USD","BFDAE_BP6_USD")
databaseID <- "BOP"
startdate <- "1980-01-01"
enddate <- "2016-12-31"
checkquery <- FALSE
FDI_ASSETS <- as.data.frame(CompactDataMethod(databaseID, list(CL_FREA = "Q", CL_AREA_BOP = "", CL_INDICATOR_BOP= fdi_asst), startdate, enddate, checkquery))
我的数据框'FDI_ASSETS'看起来像这样(我提供了一张图片而不是head()以方便)
最后一列是一个列表,还包含三个变量:
head(FDI_ASSETS$Obs)
[[1]]
@TIME_PERIOD @OBS_VALUE @OBS_STATUS
1 1980-Q1 30.0318922812441 <NA>
2 1980-Q2 23.8926174547104 <NA>
3 1980-Q3 26.599634375058 <NA>
4 1980-Q4 32.7522451203517 <NA>
5 1981-Q1 44.124979234001 <NA>
6 1981-Q2 35.9907120805994 <NA>
我的目标
我想做以下事情:
"@UNIT_MULT == 6"
然后将"@OBS_VALUE"
中的FDI_ASSETS$Obs
除以1000 "@UNIT_MULT == 3"
然后将"@OBS_VALUE"
中的FDI_ASSETS$Obs
除以1000000 更新
FDI_ASSETS
的结构如下所示:
str(FDI_ASSETS)
'data.frame': 375 obs. of 6 variables:
$ @FREQ : chr "Q" "Q" "Q" "Q" ...
$ @REF_AREA : chr "FI" "MX" "MX" "TO" ...
$ @INDICATOR : chr "BFDAE_BP6_USD" "BFDAD_BP6_USD" "BFDAE_BP6_USD" "BFDAD_BP6_USD" ...
$ @UNIT_MULT : chr "6" "6" "6" "3" ...
$ @TIME_FORMAT: chr "P3M" "P3M" "P3M" "P3M" ...
$ Obs :List of 375
..$ :'data.frame': 147 obs. of 3 variables:
.. ..$ @TIME_PERIOD: chr "1980-Q1" "1980-Q2" "1980-Q3" "1980-Q4" ...
.. ..$ @OBS_VALUE : chr "30.0318922812441" "23.8926174547104" "26.599634375058" "32.7522451203517" ...
.. ..$ @OBS_STATUS : chr NA NA NA NA ...
..$ :'data.frame': 60 obs. of 2 variables:
.. ..$ @TIME_PERIOD: chr "2001-Q1" "2001-Q3" "2002-Q1" "2002-Q2" ...
.. ..$ @OBS_VALUE : chr "9.99999999748979E-05" "9.99999997475243E-05" "9.8999999998739E-05" "-9.90000000342661E-05" ...
..$ :'data.frame': 63 obs. of 2 variables:
.. ..$ @TIME_PERIOD: chr "2001-Q1" "2001-Q2" "2001-Q3" "2001-Q4" ...
.. ..$ @OBS_VALUE : chr "130.0149" "189.627" "3453.8319" "630.483" ...
..$ :'data.frame': 17 obs. of 2 variables:
答案 0 :(得分:1)
我下载了你的数据,这很复杂。我已经删除了我的错误答案,以便你可以通过@akrun或类似的人来回答:)我现在没有时间解析它。
答案 1 :(得分:0)
我找到了以下解决方案
list_assets<-list(FDI_ASSETS=FDI_ASSETS, Portfolio_ASSETS=Portfolio_ASSETS, other_invest_ASSETS=other_invest_ASSETS, fin_der_ASSETS=fin_der_ASSETS, Reserves=Reserves)
for (df in list_assets){
for( i in 1:length(df$"@UNIT_MULT")){
if (df$"@UNIT_MULT"[i]=="6"){
df$Obs[[i]]$"@OBS_VALUE" <- as.numeric(df$Obs[[i]]$"@OBS_VALUE")
df$Obs[[i]]$"@OBS_VALUE" <- df$Obs[[i]]$"@OBS_VALUE"/1000
} else if ((df$"@UNIT_MULT"[i]=="3")){
df$Obs[[i]]$"@OBS_VALUE" <- as.numeric(df$Obs[[i]]$"@OBS_VALUE")
df$Obs[[i]]$"@OBS_VALUE" <- df$Obs[[i]]$"@OBS_VALUE"/1000000
}
}
}
请告诉我如何修改代码以使其更有效并避免这些循环。