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

时间:2014-11-23 15:28:49

标签: 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最后一次出现以来经过的天数。对于上面的例子,答案如下:

 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的新手,所以对此的任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分: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

功能setkeyvdtid上的date进行索引和排序。然后,我们通过逐步调整delta中的索引值并计算id的第一个差异来计算date。因为$ n $值的第一个差异将产生$ n-1 $ entires,我们将NA连接到结果。

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