计算列表中的变量

时间:2017-03-13 14:35:55

标签: r list conditional data-manipulation data-cleaning

我想在大型数据集中进行一些特定的计算。

这是我使用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()以方便

enter image description here

最后一列是一个列表,还包含三个变量:

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>

我的目标

我想做以下事情:

  1. if / when "@UNIT_MULT == 6"然后将"@OBS_VALUE"中的FDI_ASSETS$Obs除以1000
  2. if / when "@UNIT_MULT == 3"然后将"@OBS_VALUE"中的FDI_ASSETS$Obs除以1000000
  3. 更新

    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:
    

2 个答案:

答案 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
    }
}
}

请告诉我如何修改代码以使其更有效并避免这些循环。