我有两个非常大的数据。表: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))))
有没有更好的选择,所以代码运行得更快?
答案 0 :(得分:1)
因为你所需要的只是" true"或"假"返回,似乎你根本不需要使用ifelse。
如果我正确地读了这个(假设你的意思是B不是V),那么每当A
为NA
时,你想要false
返回,无论B的值如何。 ,为了返回true
,A
不得为NA
。接下来,为了返回true
,A不能等于B.但是,如果B
为NA
,则NA
将从测试A != B
返回。而且,如果B
为NA
,但A
不是TRUE
,则需要temp2 = (!is.na(A))&((A!=B)|is.na(B))
,所以:
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
应该做的伎俩。如果你的意思是V,那么你有三个data.tables?
关于时间安排,
{{1}}
所以,它的速度提高了约6倍。