我有两个非常大的data.table:A和B。下面的代码可以正常工作,但是速度很慢。
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))))
有没有更好的选择,因此代码可以更快地运行?
由于您只需要返回“ true”或“ false”,因此似乎根本不需要使用ifelse。
如果我正确地阅读本(假设你的意思乙不是V),那么无论什么时候A
是NA
,你要false
回来,不管B的价值。因此,为了true
要返回,A
绝对不能NA
。接下来,为了true
返回,A不能等于B。但是,如果B
是NA
,NA
则将从test返回A != B
。并且,如果B
是NA
,但A
不是,那么您想要TRUE
,所以:
temp2 = (!is.na(A))&((A!=B)|is.na(B))
应该做到的。如果您的意思是V,那么您有三个data.tables?
关于时间
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
因此,其速度提高了约6倍。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句