我很好奇是否有更好的方法来重新编码基于子集逻辑的data.tables。在下面的人为例子中,我想避免除以0:
library(data.table)
dt <- data.table(V1 = rep(1, 100),
V2 = sample(x = c(0,1,2), size = 100, replace = TRUE))
dt[V2 > 0, V3 := V1/V2]
dt[V2 == 0, V3 := 0]
答案 0 :(得分:4)
您可以先添加一列零,然后执行第一个子集计算。
dt[, V3 := 0][V2 > 0, V3 := V1/V2]
或者您可以使用ifelse()
并一次完成所有操作。
dt[, V3 := ifelse(V2 > 0, V1/V2, 0)]
答案 1 :(得分:0)
%/2%
。
library(data.table)
set.seed(1)
DT <- data.table(
V1 = rep(1, 100),
V2 = sample(x = c(0,1,2), size = 100, replace = TRUE)
)
# replace Inf after dividing
dt = copy(DT)
dt[, V3 := V1/V2
][!is.finite(V3), V3 := 0
][]
# use own divide function
`%/2%` <- function(e1, e2) ifelse(e2==0, 0, `/`(e1, e2))
dt = copy(DT)
dt[, V3 := V1 %/2% V2
][]