我有一个如下所示的数据框:
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的新手,所以对此的任何帮助都将非常感激.
我专门使用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索引和排序dt上id和date.然后我们delta通过逐步计算索引值id并计算第一个差值来计算date.因为$ n $值的第一个差异将产生$ n-1 $ entires,我们NA将结果连接起来.
方便的data.table是,即使对于大型物体,使用也非常快.
| 归档时间: |
|
| 查看次数: |
141 次 |
| 最近记录: |