2012-11-02 61 views
1

我有一個列表x其中有數百萬條目。我想將所有長度大於1的條目放入新列表z。我如何在R中有效地做到這一點?如何從一個長列表子集?

我試過這段代碼,而R只是一直運行很長時間。

z=NULL 
for(i in 1:length(x)) { 
    if(length(x[[i]])!=1) z=list(z,x[[i]]) 
} 
+0

順便說一下,這段代碼不會起作用(隨着速度變慢):你可能意味着'z = list()',那麼'z = c(z,list(x [[i]]))' –

+0

謝謝指出我的錯誤! – user1787675

回答

5

只要做到:

z = x[sapply(x, length) > 1] 
+0

Bah,我什麼時候會學習?先回答,然後編輯! ;-) –

+0

謝謝大衛!這真的爲我節省了很多時間! – user1787675

6

這是您要使用一個案例vapply

z <- x[vapply(x, length, integer(1)) > 1L] 

下面是基準比較sapplyvapply

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 
+2

+1:非凡回答 –

+0

Thanks flodel!我還有一個問題。比較不同功能的效率時,我應該參考哪個時間? – user1787675

相關問題