为 data.table 中的缺失值添加行
Adding row for missing value in data.table
我的问题在某种程度上与 Fastest way to add rows for missing values in a data.frame? 有关,但我认为更难一些。而且我不知道如何使这个解决方案适应我的问题。
这是我的 data.table 的样子:
ida idb value date
1: A 2 26600 2004-12-31
2: A 3 19600 2005-03-31
3: B 3 18200 2005-06-30
4: B 4 1230 2005-09-30
5: C 2 8700 2005-12-31
不同之处在于每个 'ida' 都有自己的日期,并且至少有一行 'ida' 与每个日期一起出现,但不一定是所有 'idb'。我想插入每个缺失的 ('ida','idb') 对缺失与相应的日期和 0 作为值。
此外,日期没有周期性。
你会怎么做?
期望的输出:
ida idb value date
1: A 2 26600 2004-12-31
1: A 2 0 2005-03-31
2: A 3 19600 2005-03-31
2: A 3 0 2004-12-31
3: B 3 18200 2005-06-30
4: B 3 0 2005-09-30
5: B 4 1230 2005-09-30
4: B 4 0 2005-06-30
6: C 2 8700 2005-12-31
顺序无关紧要。每个缺失的日期都用 0 值填充。
您只需按照每个 ida
:
做与链接问题中相同的事情
setkey(dt, idb, date)
dt[, .SD[CJ(unique(idb), unique(date))], by = ida][is.na(value), value := 0][]
# ida idb value date
#1: A 2 26600 2004-12-31
#2: A 2 0 2005-03-31
#3: A 3 0 2004-12-31
#4: A 3 19600 2005-03-31
#5: C 2 8700 2005-12-31
#6: B 3 18200 2005-06-30
#7: B 3 0 2005-09-30
#8: B 4 0 2005-06-30
#9: B 4 1230 2005-09-30
我的问题在某种程度上与 Fastest way to add rows for missing values in a data.frame? 有关,但我认为更难一些。而且我不知道如何使这个解决方案适应我的问题。
这是我的 data.table 的样子:
ida idb value date
1: A 2 26600 2004-12-31
2: A 3 19600 2005-03-31
3: B 3 18200 2005-06-30
4: B 4 1230 2005-09-30
5: C 2 8700 2005-12-31
不同之处在于每个 'ida' 都有自己的日期,并且至少有一行 'ida' 与每个日期一起出现,但不一定是所有 'idb'。我想插入每个缺失的 ('ida','idb') 对缺失与相应的日期和 0 作为值。
此外,日期没有周期性。
你会怎么做?
期望的输出:
ida idb value date
1: A 2 26600 2004-12-31
1: A 2 0 2005-03-31
2: A 3 19600 2005-03-31
2: A 3 0 2004-12-31
3: B 3 18200 2005-06-30
4: B 3 0 2005-09-30
5: B 4 1230 2005-09-30
4: B 4 0 2005-06-30
6: C 2 8700 2005-12-31
顺序无关紧要。每个缺失的日期都用 0 值填充。
您只需按照每个 ida
:
setkey(dt, idb, date)
dt[, .SD[CJ(unique(idb), unique(date))], by = ida][is.na(value), value := 0][]
# ida idb value date
#1: A 2 26600 2004-12-31
#2: A 2 0 2005-03-31
#3: A 3 0 2004-12-31
#4: A 3 19600 2005-03-31
#5: C 2 8700 2005-12-31
#6: B 3 18200 2005-06-30
#7: B 3 0 2005-09-30
#8: B 4 0 2005-06-30
#9: B 4 1230 2005-09-30