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

R 重新编码多个子集的最佳实践,r,data.table,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] 库(data.table) d

我很好奇是否有更好的方法基于子集逻辑重新编码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]
库(data.table)
dt 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)]

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

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

库(data.table)
种子(1)

DT事实上你不想除法。您想要的是带异常的除法,所以您可以定义自己的除法函数,请参见下面的
%/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
   ][]

库(data.table)
种子(1)

DT下面的答案为您提供了更多选项,但我认为您需要定义“更好”在这里的含义….?在使用
sample()
时使用
set.seed()
,这样我们就可以得到与您相同的示例代码下面的答案为您提供了更多选项,但我认为您需要定义“更好”在这里的含义….使用
set.seed()
使用
sample()
时,我们可以获得与您相同的示例代码