2014-11-23 2 views
0

보낸 I는 다음과 같습니다 데이터 프레임이 있습니다R 일수 마지막으로 발생한

나는 각 행에 대해, 찾을 필요가
id  date 
1001 2012-10-11 
1005 2013-02-20 
1005 2012-11-21 
1005 2014-03-14 
1003 2013-10-25 
1003 2013-11-30 

, 그 마지막 발생 이후 며칠의 수 신분증. 위의 예를 들어, 대답은 같을 것이다 :

id  date  no_of_days 
1001 2012-10-11 NA 
1005 2013-02-20 91 
1005 2012-11-21 NA 
1005 2014-03-14 387 
1003 2013-10-25 NA 
1003 2013-11-30 36 

내가 하위 그룹에 함수를 적용하여 생성 된 값으로 새 열을 추가 할 수있는 점에 저를 얻었다 검색하는 비트합니다 (R 동등한 의 Ststa의 bysort) :

df$no_of_days<-with(df,ave(id,id,FUN=days_passed,na.rm=TRUE)) 

그러나, 나는 그 uniqid의 마지막 발생을 발견하고 그에 따라 기능을 공식화 가지고 정의하는 새로운 기능 days_passed가 까다로운 것으로 증명된다.

저는 R이 처음이므로, 이것에 대한 도움이 있으면 대단히 감사하겠습니다.

+0

이것은 R 프로그래밍에 대한 좋은 질문이지만 통계적 측면이없는 것처럼 보입니다. SO 로의 마이그레이션 후보입니까? – Silverfish

답변

5

내가 독점적으로 data.table를 사용, 그래서이

library(data.table) 
dt <- data.table(id=c(1001,1005,1005,1005,1003,1003), 
date=as.IDate(c("2012-10-11","2013-02-20","2012-11-21", 
"2014-03-14", "2013-10-25","2013-11-30"))) 

setkeyv(dt, c("id","date")) 
dt[,delta:=c(NA,diff(date)),by=id] 
dt 
    id  date delta 
1: 1001 2012-10-11 NA 
2: 1003 2013-10-25 NA 
3: 1003 2013-11-30 36 
4: 1005 2012-11-21 NA 
5: 1005 2013-02-20 91 
6: 1005 2014-03-14 387 

... 기능 setkeyv 모두 인덱스 data.table를 사용하여 응답하고 iddatedt을 정렬합니다. 그런 다음 id의 인덱싱 된 값을 단계적으로 수행하고 date의 첫 번째 차이를 계산하여 delta을 계산합니다. $ n $ 값의 첫 번째 차이로 인해 $ n-1 $ entires가 산출되므로 NA을 연결합니다.

편리하게도 data.table의 사용은 큰 물체에서도 매우 빠릅니다.