在某些情况下为 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 列。
我想在我之前提出的问题 (
所以这次我想插入一个 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 列。