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

时间:2015-09-30 21:03:08

标签: r data.table

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

2 个答案:

答案 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
   ][]