在 data.table 中使用 Reduce() 时跳过 NA

Skip NAs when using Reduce() in data.table

我正在尝试获取 data.table 行的累计总和,并且能够在另一个 Whosebug 中找到此代码 post:

devDF1[,names(devDF1):=Reduce(`+`,devDF1,accumulate=TRUE)]

它完成了我需要它做的事情,但是当它遇到以 NA 开头的行时,它只会用 NA 替换该行中的每个元素(而不是该行中其他元素的累积和)排)。我不想用 0 替换 NA,因为我将需要此输出以进行进一步处理,并且不希望在行中重复相同的最终 cumsum。有什么办法可以调整那段代码以忽略 NA 吗?或者是否有替代代码可用于在忽略 NA 的同时获取 data.table 中行的累计和?

考虑这个例子:

library(data.table)
dt <- data.table(a = 1:5, b = c(3, NA, 1, 2, 4), c = c(NA, 1, NA, 3, 4))
dt

#   a  b  c
#1: 1  3 NA
#2: 2 NA  1
#3: 3  1 NA
#4: 4  2  3
#5: 5  4  4

如果你想将以前的值携带到 NA 值,你可以使用:

dt[, names(dt) := lapply(.SD, function(x) cumsum(replace(x, is.na(x), 0))), 
     .SDcols = names(dt)]
dt

#    a  b c
#1:  1  3 0
#2:  3  3 1
#3:  6  4 1
#4: 10  6 4
#5: 15 10 8

如果您想将 NA 保持为 NA :

dt[, names(dt) := lapply(.SD, function(x) {
  x1 <- cumsum(replace(x, is.na(x), 0))
  x1[is.na(x)] <- NA
  x1
  }), .SDcols = names(dt)]

dt

#    a  b  c
#1:  1  3 NA
#2:  3 NA  1
#3:  6  4 NA
#4: 10  6  4
#5: 15 10  8