r - alternative to ifelse in data.table -
i have big 2 data.table: , b. code below works fine, slow.
temp2=ifelse(is.na(a) & is.na(b),false, ifelse(!is.na(a) & is.na(v),true, ifelse(is.na(a) & !is.na(b),false, ifelse(a!=b,true,false)))) is there better alternative code run faster?
since need "true" or "false" returned, not seem need use ifelse @ all.
if reading correctly (and assuming meant b not v), whenever a na, want false returned, regardless of value of b. thus, in order true returned, a must not na. next, in order true returned, cannot equal b. but, if b na, na returned testing a != b. and, if b na, a not, want true, so:
temp2 = (!is.na(a))&((a!=b)|is.na(b)) should trick. if did mean v, have 3 data.tables?
concerning timing,
require(data.table) a<- data.table(v1=sample(c(1,2,na),1e6,replace=true),v2=sample(c(1,2,na),1e6,replace=true)) b<- data.table(v1=sample(c(1,2,na),1e6,replace=true),v2=sample(c(1,2,na),1e6,replace=true)) system.time({temp1 = (!is.na(a))&((a!=b)|(is.na(b)))}) ## user system elapsed ## 0.41 0.00 0.41 system.time({temp2 =ifelse(is.na(a) & is.na(b),false, ifelse(!is.na(a) & is.na(b),true, ifelse(is.na(a) & !is.na(b),false, ifelse(a!=b,true,false))))}) ## user system elapsed ## 2.56 0.11 2.68 all.equal(temp1,temp2) ## true so, 6 times faster.
Comments
Post a Comment