在某些情况下为 data.table 中的缺失值添加行

Adding row for missing value in data.table, under some condition

我想在我之前提出的问题 () 的基础上再做补充。其实我不需要加那么多零,只需要第一个缺的是0就可以了

所以这次我想插入一个 0 只有当相同的 ('ida', 'idb') 的最后一个条目已经不是 0 时。我们假设原来没有 0 data.table.

所以一个例子是:

 ida       idb         value     date
  A         3          26600  2004-12-31
  A         3          19600  2005-03-31
  A         3          18200  2005-06-30
  A         4           9560  2004-12-31
  B         1           2600  2004-12-31
  B         1            100  2005-03-31
  B         1           8200  2005-06-30
  B         1           9560  2007-12-31
  B         9           1423  2004-12-31
  B         9           1235  2005-06-30
  C         2           8700  2005-12-31

给出:

 ida       idb         value     date
  A         3          26600  2004-12-31
  A         3          19600  2005-03-31
  A         3          18200  2005-06-30
  A         4           9560  2004-12-31
  A         4              0  2005-03-31
  B         1           2600  2004-12-31
  B         1            100  2005-03-31
  B         1           8200  2005-06-30
  B         1           9560  2007-12-31
  B         9           1423  2004-12-31
  B         0              0  2005-03-31
  B         9           1235  2005-06-30
  B         0              0  2007-12-31
  C         2           8700  2005-12-31

我找到了一种方法。 因此,我们采用我之前问题的答案:

setkey(dt, idb, date)
dt[, .SD[CJ(unique(idb), unique(date))], by = ida][is.na(value), value := 0]

然后我们再添加一些步骤:

setkey(dt, idb, date)
dt[, .SD[CJ(unique(idb), unique(date))][is.na(value), value := 0][prev.value := c(0, value[-.N])][value > 0 | (value == 0 & prev.value > 0), ][, prev.value := NULL], by = ida]

因此,对于每个子集,我们将 NA 替换为 0,然后添加一个与先前值对应的新列。最后我们只保留行 != 0 和前 0 行,并删除 prev.value 列。