重新编码多个子集的最佳实践

Best practice to recode multiple subsets

我很好奇是否有更好的方法根据子集逻辑重新编码 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]

您可以先添加一列零,然后进行第一个子集计算。

dt[, V3 := 0][V2 > 0, V3 := V1/V2]

或者您可以使用 ifelse() 一次完成。

dt[, V3 := ifelse(V2 > 0, V1/V2, 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
   ][]