合并大量逻辑向量

时间:2015-06-11 19:40:00

标签: r list merge bigdata

我有一大堆TRUE/FALSE个逻辑向量列表(144个列表元素,每个长度大约2300万个元素)。我想使用any合并它们以生成一个逻辑向量。如果每个列表元素的任何第一个元素都是TRUE,则返回TRUE,依此类推向量的长度。这是一个例子:

#  Some data
set.seed(1)
ll <- replicate(3,sample(c(TRUE,FALSE),5,TRUE),simplify=F)

#[[1]]
#[1]  TRUE  TRUE FALSE FALSE  TRUE

#[[2]]
#[1] FALSE FALSE FALSE FALSE  TRUE

#[[3]]
#[1]  TRUE  TRUE FALSE  TRUE FALSE

#  What I want (and one way of doing it)...
apply( do.call(cbind,ll) , 1 , any )
#  [1]  TRUE  TRUE FALSE  TRUE  TRUE

等等,您已经在该代码中发布了解决方案,为什么要问这个问题?

我有144个向量,每个长度在我的实际数据中为23,721,703。尝试上述操作会引发错误,例如:

# *** caught segfault ***
#address 0x18, cause 'memory not mapped'

OR

#Error in aperm.default(X, c(s.call, s.ans)) : 
#  long vectors not supported yet: memory.c:1648

我在Ubuntu 64bit上使用112Gb RAM运行R 3.0.2。

1 个答案:

答案 0 :(得分:3)

您可以使用Reduce

  Reduce('|', ll)

基准

set.seed(1)
ll <- replicate(144, sample(c(TRUE, FALSE), 1e5,
       replace=TRUE), simplify=FALSE)
system.time(apply(do.call(cbind, ll), 1, any))
# user  system elapsed 
# 0.575   0.022   0.598 

system.time(Reduce(`|`, ll))
# user  system elapsed 
# 0.287   0.008   0.295