我有一个如下所示的数据框:
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的新手,所以对此的任何帮助都将不胜感激。
答案 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
功能setkeyv
对dt
和id
上的date
进行索引和排序。然后,我们通过逐步调整delta
中的索引值并计算id
的第一个差异来计算date
。因为$ n $值的第一个差异将产生$ n-1 $ entires,我们将NA
连接到结果。
方便地,data.table
的使用非常快,即使对于大型物体也是如此。