data.table中ifelse的替代方法

时间:2014-08-19 08:57:29

标签: r if-statement 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))))

有没有更好的选择,所以代码运行得更快?

1 个答案:

答案 0 :(得分:1)

因为你所需要的只是" true"或"假"返回,似乎你根本不需要使用ifelse。

如果我正确地读了这个(假设你的意思是B不是V),那么每当ANA时,你想要false返回,无论B的值如何。 ,为了返回trueA不得为NA。接下来,为了返回true,A不能等于B.但是,如果BNA,则NA将从测试A != B返回。而且,如果BNA,但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倍。