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

Popular posts from this blog

java - How to specify maven bin in eclipse maven plugin? -

single sign on - Logging into Plone site with credentials passed through HTTP -

php - Why does AJAX not process login form? -