2012-05-30 3 views
3

고유 ID로 식별되는 여러 시간 시리즈가있는 데이터 프레임이 있습니다. 0 값만있는 모든 시계열을 제거하고 싶습니다. 데이터 프레임의 0 값만있는 시계열 제거

id date   value 
AAA 2010/01/01 9 
AAA 2010/01/02 10 
AAA 2010/01/03 8 
AAA 2010/01/04 4 
AAA 2010/01/05 12 
CCC 2010/01/01 45 
CCC 2010/01/02 46 
CCC 2010/01/03 0 
CCC 2010/01/04 0 
CCC 2010/01/05 40 

는 후속이며, 데이터 프레임의 모양은 다음과 같이 있도록 I는 0 값을 가진 모든 시계열을 원하는
id date   value 
AAA 2010/01/01 9 
AAA 2010/01/02 10 
AAA 2010/01/03 8 
AAA 2010/01/04 4 
AAA 2010/01/05 12 
B 2010/01/01 0 
B 2010/01/02 0 
B 2010/01/03 0 
B 2010/01/04 0 
B 2010/01/05 0 
CCC 2010/01/01 45 
CCC 2010/01/02 46 
CCC 2010/01/03 0 
CCC 2010/01/04 0 
CCC 2010/01/05 40 

데이터 프레임은 다음과 외모로는 제거 할 이전 질문까지는 data.tables 패키지를 사용하여 정말 좋은 해결책으로 답을 얻었습니다. 이 시도

R efficiently removing missing values from the start and end of multiple time series in 1 data frame

+0

데이터 프레임 ID는 항상 정렬되어 있습니까? – Fhnuzoag

+0

@Fhnuzoag ID와 날짜로 데이터 프레임을 정렬했습니다. – sizeight

+0

데이터 프레임이 이미 정렬되어있는 경우에는 ave 메소드보다 더 빠른 방법이있을 것입니다. 그러나 아마도 그만한 가치는 없습니다. – Fhnuzoag

답변

5

다음이 작성하고 읽기 쉽게하는 data.table입니다. This answer.SD을 매우 잘 설명합니다. ave의 가보의 좋은 사용을 따기

하지만 긴 또는 이와 유사한 변수 이름의 많은 경우 오타 버그의 원인이 될 수 있습니다 ( DF) 세 번, 같은 변수 이름을 반복하지 않고, 시도 :

dat[ ave(value!=0,id,FUN=any) ] 

이러한 두 속도의 차이는 i) 그룹 수 ii) 각 그룹의 크기 iii) 실제 dat의 열 수를 포함하여 여러 가지 요인에 따라 달라질 수 있습니다.

+0

솔루션을 제공해 주셔서 감사합니다. data.table 패키지는 정말 유용합니다. 나 자신을 위해 데이터를 훨씬 쉽게 다루기 위해 노력하고 있습니다. – sizeight

1

쉬운 plyr 솔루션은 ...

ddply(mydat,"id",function(x) if (all(x$value==0)) NULL else x) 

이 (확인을 작동하는 것 같다)하지만 data.table와 빠른 해결책이 될 수있다

2

이 될 것입니다. 패키지가 사용되지 않습니다.

dat[,.SD[any(value!=0)],by=id] 

.SD 스탠드 데이터의 부분 집합 : dat 만약

DF[ ave(DF$value != 0, DF$id, FUN = any), ]