R - 自上次发生以来的天数

shr*_*sgm 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
Run Code Online (Sandbox Code Playgroud)

我需要为每一行找到自该ID最后一次出现以来经过的天数.对于上面的示例,答案如下所示:

 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
Run Code Online (Sandbox Code Playgroud)

一点点的搜索让我得到了一个新的列,其中包含通过在子组上应用函数生成的值(相当于Ststa的R bysort):

df$no_of_days<-with(df,ave(id,id,FUN=days_passed,na.rm=TRUE))
Run Code Online (Sandbox Code Playgroud)

但是,定义新函数days_passed证明是棘手的,因为我必须找到该uniqid的最后一次出现,然后相应地制定该函数.

我是R的新手,所以对此的任何帮助都将非常感激.

Syc*_*ica 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
Run Code Online (Sandbox Code Playgroud)

功能setkeyv索引和排序dtiddate.然后我们delta通过逐步计算索引值id并计算第一个差值来计算date.因为$ n $值的第一个差异将产生$ n-1 $ entires,我们NA将结果连接起来.

方便的data.table是,即使对于大型物体,使用也非常快.