【问题标题】:R - Number of days since last occurrence [duplicate]R - 自上次发生以来的天数 [重复]
【发布时间】:2014-11-23 15:28:48
【问题描述】:

我有一个如下所示的数据框:

 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 新手,因此我们将不胜感激。

【问题讨论】:

  • 这是一个关于 R 编程的好问题,但似乎没有统计方面 - 它是否适合迁移到 SO?

标签: r


【解决方案1】:

我只使用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 在 id 和 date 上对 dt 进行索引和排序。然后我们通过遍历id 中的索引值并计算date 的一阶差分来计算delta。因为 $n$ 值的第一个差异将产生 $n-1$ 个整数,我们将NA 连接到结果。

方便的是,data.table 的使用速度非常快,即使对于大型对象也是如此。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-04
    • 2017-10-26
    • 2013-12-04
    • 1970-01-01
    • 1970-01-01
    • 2020-05-25
    相关资源
    最近更新 更多