我有一大堆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。
答案 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