在 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
我正在尝试获取 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