【发布时间】:2018-12-12 17:32:37
【问题描述】:
this question 的后续跟进。
我有三个数据表(实际的input 一个更大,性能很重要,所以我必须尽可能多地使用data.table):
input <- fread(" ID | T1 | T2 | T3 | DATE
ACC001 | 1 | 0 | 0 | 31/12/2016
ACC001 | 1 | 0 | 1 | 30/06/2017
ACC002 | 0 | 1 | 1 | 31/12/2016", sep = "|")
mevs <- fread(" DATE | INDEX_NAME | INDEX_VALUE
31/12/2016 | GDP | 1.05
30/06/2017 | GDP | 1.06
31/12/2017 | GDP | 1.07
30/06/2018 | GDP | 1.08
31/12/2016 | CPI | 0.02
30/06/2017 | CPI | 0.00
31/12/2017 | CPI | -0.01
30/06/2018 | CPI | 0.01 ", sep = "|")
time <- fread(" DATE
31/12/2017
30/06/2018 ", sep = "|")
有了这些,我需要实现两件事:
将第二个 dt(
mevs) 中的GDP和CPI值插入到第一个 (input) 中,以根据T1、@987654330 在最后一列中进行一些计算@、T3、GDP和CPI。对第三个 dt (
time) 中给定的时间间隔进行投影,将前一个间隔中的T1、T2和T3值复制到相同的ID中(所以 ACC001如果存在则保留1, 0, 1)(如果不存在则用0填充)并从相应的日期获取GDP和CPI。
为此,我使用以下代码:
ones <- input[, .N, by = ID][N == 1, ID]
input[, .SD[time, on = "DATE"], by = ID
][dcast(mevs, DATE ~ INDEX_NAME), on = "DATE", `:=` (GDP = i.GDP, CPI = i.CPI)
][, (2:4) := lapply(.SD, function(x) if (.BY %in% ones) replace(x, is.na(x), 0L) else zoo::na.locf(x) )
, by = ID, .SDcols = 2:4][]
哪个(感谢@Jaap):
input[, .SD[time, on = "DATE"], by = ID]将每个 ID 的时间 data.table 连接到其余列,从而扩展 data.table。然后将一个宽版本的 mevs
(dcast(mevs, DATE ~ INDEX_NAME))加入到扩展的 data.table 中。最后用
zoo包中的na.locf函数填充了扩展data.table中的缺失值。
预期的输出是:
ID T1 T2 T3 DATE GDP CPI
1: ACC001 1 0 0 31/12/2016 1.05 0.02
2: ACC001 1 0 1 30/06/2017 1.06 0.00
3: ACC001 1 0 1 31/12/2017 1.07 -0.01
4: ACC001 1 0 1 30/06/2018 1.08 0.01
5: ACC002 0 1 1 31/12/2016 1.05 0.02
6: ACC002 0 0 0 30/06/2017 1.06 0.00
7: ACC002 0 0 0 31/12/2017 1.07 -0.01
8: ACC002 0 0 0 30/06/2018 1.08 0.01
但我得到的是:
ID T1 T2 T3 DATE GDP CPI
1: ACC001 NA NA NA 31/12/2017 1.07 -0.01
2: ACC001 NA NA NA 30/06/2018 1.08 0.01
3: ACC002 NA NA NA 31/12/2017 1.07 -0.01
4: ACC002 NA NA NA 30/06/2018 1.08 0.01
我几乎可以肯定,在第一步中,input 和 time 之间的连接选择肯定是错误的,但我找不到解决方法。
感谢大家的宝贵时间。
【问题讨论】:
标签: data.table r join data.table na