用另一行的值替换NA,具体取决于特定国家/地区和年份

时间:2019-11-05 11:14:59

标签: r if-statement data.table

我有一个data.table,其中包含货币(例如美元),如下所示,该国家/地区在转换为EUR后具有NA。此外,我还有货币转换为欧元的年份:

library(data.table)
DT <- fread(
    "Val iso   year   
     2   NLD   1998
     NA  NLD   1999   
     NA  NLD   2000
     NA  NLD   2001   
     NA  NLD   2002  
     1   GBR   1998
     1   GBR   1999   
     2   GBR   2000
     NA  GBR   2001   
     1   GBR   2002  
     NA  EUR   1998
     1   EUR   1999   
     1   EUR   2000
     2   EUR   2001   
     1   EUR   2002  
     3   GRC   1998
     NA  GRC   1999
     4   GRC   2000
     NA  GRC   2001
     NA  GRC   2002",
   header = TRUE
)

EUR <- fread(
    " e_iso e_year   
      NLD   1999   
      GRC   2001",
   header = TRUE
)

我想仅在各自国家/地区改用欧元后,才使用欧元货币代替NA。因此,例如ValGRE的{​​{1}}应该保持不适用。

我在考虑以下方面的事情

1999

但是我不确定如何进行。所需的输出:

DT[EUR$e_iso %in% DT_iso & EUR$e_year %in% DT$year, Val := ?]

编辑:

我在所需的输出中犯了一个小错误(现已更正)。现在,希腊在2001年的价值为2。

例如,library(data.table) DT <- fread( "Val iso year 2 NLD 1998 1 NLD 1999 1 NLD 2000 1 NLD 2001 1 NLD 2002 1 GBR 1998 1 GBR 1999 2 GBR 2000 NA GBR 2001 1 GBR 2002 NA EUR 1998 1 EUR 1999 1 EUR 2000 2 EUR 2001 1 EUR 2002 3 GRC 1998 NA GRC 1999 4 GRC 2000 2 GRC 2001 1 GRC 2002", header = TRUE ) 第19行为DT[is.na(Val), Val := EUR[.SD, as.integer(NA ^ is.na(x.e_iso)), on = .(e_iso = iso, e_year <= year)]] = Val,但由于欧元在2001年的价值,第19行应为1 = Val(第14行) )是2。

2 个答案:

答案 0 :(得分:2)

DT[EUR, 
   on = .(iso = e_iso, year >= e_year), 
   Val := DT[iso == "EUR" & year == .BY, Val], 
   by = year]

    Val iso year
 1:   2 NLD 1998
 2:   1 NLD 1999
 3:   1 NLD 2000
 4:   2 NLD 2001
 5:   1 NLD 2002
 6:   1 GBR 1998
 7:   1 GBR 1999
 8:   2 GBR 2000
 9:  NA GBR 2001
10:   1 GBR 2002
11:  NA EUR 1998
12:   1 EUR 1999
13:   1 EUR 2000
14:   2 EUR 2001
15:   1 EUR 2002
16:   3 GRC 1998
17:  NA GRC 1999
18:   4 GRC 2000
19:   2 GRC 2001
20:   1 GRC 2002

答案 1 :(得分:1)

我们可以用left_joinDT的值EUR isoreplace,其中year >= e_year的等价货币为"EUR"同年。

library(dplyr)

left_join(DT, EUR, by = c('iso' = 'e_iso')) %>%
   mutate(Val = replace(Val, year >= e_year, 
                Val[iso == "EUR" & year == first(e_year)]))


#     Val iso    year
#   <dbl> <chr> <int>
# 1     2 NLD    1998
# 2     1 NLD    1999
# 3     1 NLD    2000
# 4     1 NLD    2001
# 5     1 NLD    2002
# 6     1 GBR    1998
# 7     1 GBR    1999
# 8     2 GBR    2000
# 9    NA GBR    2001
#10     1 GBR    2002
#11    NA EUR    1998
#12     1 EUR    1999
#13     1 EUR    2000
#14     2 EUR    2001
#15     1 EUR    2002
#16     3 GRC    1998
#17    NA GRC    1999
#18     4 GRC    2000
#19     1 GRC    2001
#20     1 GRC    2002