2012-11-02 8 views
1

목록에 수백만 개의 항목이있는 x 목록이 있습니다. 그리고 하나보다 큰 길이의 모든 항목을 새 목록 z에 넣고 싶습니다. R에서 어떻게 효율적으로이 작업을 수행 할 수 있습니까?긴 목록에서 부분 집합하는 방법?

이 코드를 시도한 결과, R은 오랫동안 계속 실행됩니다.

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

:

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

벤치 마크 sapplyvapply을 비교하는 덧붙여 말하자면, z = list (x, [list (x [[i])))' –

+0

고맙습니다. 내 실수를 지적! – user1787675

답변

5

그냥 수행

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

Bah, 언제 배울 수 있습니까? 먼저 대답하고 편집하십시오! ;-) –

+0

감사 데이빗! 정말 저에게 많은 시간을 절약 해줍니다! – user1787675

6

이 사용하려는 한 경우입니다 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 
+2

+1 : 특별한 대답 –

+0

감사의 말이다! 추가 질문이 있습니다. 다른 기능의 효율성을 비교할 때 어느 때를 참조해야합니까? – user1787675

관련 문제