2014-11-23 2 views
0

У меня есть кадр данных, который выглядит следующим образом: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)) 

Однако определить новую функцию days_passed, оказывается сложно, как я должен найти последнее вхождение этого uniqid, а затем сформулировать функцию соответственно.

Я новичок в R, поэтому любая помощь на этом была бы весьма признательна.

+0

Это хороший вопрос о программировании R, но, похоже, не имеет статистического аспекта - это кандидат на переход к SO? – Silverfish

ответ

5

я использовать исключительно data.table, так это ответ, используя 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 оба индекса и сортирует dt на id и date. Затем мы вычисляем delta, перейдя по индексированным значениям в id и вычисляя первое различие date. Поскольку первые разности значений $ n $ будут давать $ n-1 $ entires, мы сопоставим результат NA.

Удобно, что использование data.table очень быстро, даже для больших объектов.

Смежные вопросы