我有一個列表x
其中有數百萬條目。我想將所有長度大於1的條目放入新列表z
。我如何在R中有效地做到這一點?如何從一個長列表子集?
我試過這段代碼,而R只是一直運行很長時間。
z=NULL
for(i in 1:length(x)) {
if(length(x[[i]])!=1) z=list(z,x[[i]])
}
我有一個列表x
其中有數百萬條目。我想將所有長度大於1的條目放入新列表z
。我如何在R中有效地做到這一點?如何從一個長列表子集?
我試過這段代碼,而R只是一直運行很長時間。
z=NULL
for(i in 1:length(x)) {
if(length(x[[i]])!=1) z=list(z,x[[i]])
}
只要做到:
z = x[sapply(x, length) > 1]
Bah,我什麼時候會學習?先回答,然後編輯! ;-) –
謝謝大衛!這真的爲我節省了很多時間! – user1787675
這是您要使用一個案例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:非凡回答 –
Thanks flodel!我還有一個問題。比較不同功能的效率時,我應該參考哪個時間? – user1787675
順便說一下,這段代碼不會起作用(隨着速度變慢):你可能意味着'z = list()',那麼'z = c(z,list(x [[i]]))' –
謝謝指出我的錯誤! – user1787675