2012-07-01 2 views
1

나는 꽤 큰 데이터 프레임 (몇 수백만 레코드)을 가지고있다.
다음 규칙 때문에 필터링해야합니다.
- 각 제품에 대해 x> 0 인 첫 번째 레코드 다음에 다섯 번째 레코드 앞에있는 모든 레코드를 삭제하십시오.루프가없는 데이터를 필터링 R

그래서 두 개의 열 (ID와 x)에만 관심이 있습니다. 데이터 프레임은 ID별로 정렬됩니다.
루프를 사용하는 것이 매우 쉽지만 큰 데이터 프레임에서는 루프가 잘 수행되지 않습니다.

'벡터 스타일'에서 어떻게 수행하나요? 필터링 후
필터링

ID x 
1 0 
1 0 
1 5 # First record with x>0 
1 0 
1 3 
1 4 
1 0 
1 9 
1 0 # Delete all earlier records of that product 
1 0 
1 6 
2 0 
2 1 # First record with x>0 
2 0 
2 4 
2 5 
2 8 
2 0 # Delete all earlier records of that product 
2 1 
2 3 

전 :

예 이러한 분할을 위해

ID x 
1 9 
1 0 
1 0 
1 6 
2 0 
2 1 
2 3 

답변

4

이 적용 문제를 결합 - 나는 plyr를 사용하여 좋아합니다. 속도가 문제가되는 경우 대안이 있지만 대부분의 경우 - 플라이어는 이해하기 쉽고 사용하기 쉽습니다. 위에서 설명한 논리를 구현 한 함수를 작성한 다음 ddply()에 ID를 기반으로 데이터의 각 청크를 처리하는 함수를 제공했습니다.

fun <- function(x, column, threshold, numplus){ 
    whichcol <- which(x[column] > threshold)[1] 
    rows <- seq(from = (whichcol + numplus), to = nrow(x)) 
    return(x[rows,]) 
} 

그리고 ddply()

require(plyr) 
ddply(dat, "ID", fun, column = "x", threshold = 0, numplus = 5) 
#----- 
    ID x 
1 1 9 
2 1 0 
3 1 0 
4 1 6 
5 2 0 
6 2 1 
7 2 3 
+0

덕분에이 먹이를! 그것은 작동합니다. 그게 바로 제가 뭘 찾고 있었는지 - 깨끗한 R 스타일의 솔루션입니다. –

관련 문제