2015-09-30 3 views
1

Мне любопытно, есть ли лучший способ перекодировать 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

ниже ответ дает вам больше возможностей, но я думаю, что вы должны определить, что «лучше» означает здесь ..? – eddi

+0

используйте 'set.seed()' при использовании 'sample()', поэтому мы можем иметь тот же примерный код, что и вы – jangorecki

ответ

4

Вы можете добавить столбец из нулей, а затем сделать первый расчет подмножество.

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

Или вы можете использовать ifelse() и сделать все это сразу.

dt[, V3 := ifelse(V2 > 0, V1/V2, 0)] 
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 
    ][] 
Смежные вопросы