我有一个列表x
,里面有数百万个条目。我希望将长度大于1的所有条目放入新列表z
。我怎样才能在R中有效地做到这一点?
我尝试了这段代码,而R只是长时间保持运行。
z=NULL
for(i in 1:length(x)) {
if(length(x[[i]])!=1) z=list(z,x[[i]])
}
答案 0 :(得分:6)
这是您要使用vapply
:
z <- x[vapply(x, length, integer(1)) > 1L]
以下是比较sapply
和vapply
的基准:
A <- list( x = c(), y = c(1), z = c(1, 2))
B <- A[sample(1:3, 1e7, replace = TRUE)]
system.time(sapply(B, length))
# user system elapsed
# 55.95 0.54 56.50
system.time(vapply(B, length, integer(1)))
# user system elapsed
# 6.78 0.00 6.78
答案 1 :(得分:5)
只是做:
z = x[sapply(x, length) > 1]