我有一个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。因此,例如Val
中GRE
的{{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。
答案 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_join
和DT
的值EUR
iso
和replace
,其中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