2017-05-10 4 views
1

"id"와 "date"라는 제목의 데이터 프레임이 있습니다. 여기서 각 ID는 여러 날짜를 가질 수 있습니다. 예 :ddply를 사용하여 각 하위 집합의 첫 번째 항목 제거

id date 
001 03/05/2000 
001 06/05/2001 
001 01/09/2002 
002 03/05/2000 
002 03/09/2004 
003 03/05/2000 
003 03/07/2001 
003 02/10/2002 

첫 번째 항목의 행을 제거하려는 경우 (날짜순). 위의 예를 들어 내가 끝낼 할 것입니다 그래서 : 행운과

reduced <- ddply(data, .(id), function(x) x[-1,]) 

:

id date 
001 06/05/2001 
001 01/09/2002 
002 03/09/2004 
003 03/07/2001 
003 02/10/2002 

나는의 라인을 따라 일을 시도했습니다.

어떻게하면 효율적으로 할 수 있을까요?

문제는 ID를 기반으로하는 하위 집합으로 분해하여 첫 번째 행을 삭제 (날짜순 정렬) 한 다음 최종 데이터 프레임으로 다시 결합합니다. 이는 보통 ddply가 일반적으로 좋지만 볼 수 없습니다. 여기에서 일하게.

답변

0

효율성 부분에 대해서는

setDT(dat1)[,tail(.SD,-1),by="id"] 

, 나는에 마이크로 벤치 마크를 실행 OP와 함께 4 개의 검색어 ' ddply에 대한 질의. 아래는 = 10000을 돌리는 결과입니다. BaseR이 중복 된 것은 제가 작성한 방식으로 작성한 쿼리보다 조금 앞선 것 같습니다. 이 쿼리를 작성하는 또 다른 방법이있을 때 변경 될 수 있습니다.이 방법은보다 효율적으로 수행 할 수 있습니다. 누군가 나를 안내 할 수 있습니다. 감사합니다

Unit: microseconds 
             expr  min 
    setDT(dat1)[, tail(.SD, -1), by = "id"] 1458.790 
dat1[duplicated(dat1$id, fromLast = F), ] 170.227 
dat1 %>% group_by(id) %>% do(tail(., -1)) 2014.897 
    ddply(dat1, .(id), function(x) x[-1, ]) 1667.238 
     lq  mean median  uq  max neval 
1644.247 1788.5900 1715.314 1805.304 24960.212 10000 
    230.614 263.3895 251.405 277.276 4469.816 10000 
2237.728 2490.9345 2329.737 2480.637 213565.874 10000 
1845.771 2027.1384 1910.950 2003.320 237116.650 10000 

출력 :

 id  date 
    <int>  <chr> 
1  1 06-May-01 
2  1 01-Sep-02 
3  2 03-Sep-04 
4  3 03-Jul-01 
5  3 02-Oct-02 
+0

왜 downvote? 설명해주십시오 실수가있을 경우 수정하거나 삭제하십시오. 감사 – PKumar

0

dplyr 용액 :

library(dplyr) 
data %>% group_by(id) %>% slice(-1) 

    id  date 
    <chr>  <chr> 
1 001 06/05/2001 
2 001 01/09/2002 
3 002 03/09/2004 
4 003 03/07/2001 
5 003 02/10/2002 

slice(-1) 각 그룹의 첫 번째 행을 제거한다.

dat1[duplicated(dat1$id,fromLast = F),] 

data.table 사용 : dplyr:

dat1 %>% 
    group_by(id) %>% 
    do(tail(.,-1)) 

내가 정렬 된 데이터가 가정, BaseR를 사용하여

0
data <- data[order(data$date),] 
data <- data[ duplicated(data$id),]