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

时间:2015-03-25 22:38:47

标签: r data.table

我想建立一个我之前提出的问题(Adding row for missing value in data.table)。 Actualy我不需要添加这么多的零,我只需要第一个缺少的零。

所以这次我只想在同一个(' ida',' idb')的最后一个条目不是0的情况下插入0。我们假设没有原始data.table中的0。

所以一个例子是:

 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

1 个答案:

答案 0 :(得分:1)

我找到了办法。 所以我们回答上一个问题:

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]

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