计算连续活动天数

时间:2013-07-02 17:22:21

标签: r

我对R来说比较新,并且使用了stackoverflow来解决许多问题,但这是我第一次找不到直接的解决方案。真的很感谢这方面的帮助。

问题(简​​化):我的数据框包含account.id字段和start.date字段。每天可能有多个记录。我想创建一个名为sequential.days的第三个字段,该字段报告用户(account.id)处于活动状态的连续天数。

详细信息:数据已按account.id排序,然后按start.date排序。每天可以有多个记录。如果一天中有多条记录,我希望sequential.days填充值为1。

感谢。

这是一个“工作示例” - 意味着它包含了我想要生成的数据和字段的说明。

id <- c(1030, 1030, 1030, 1030, 2022, 2022, 2022, 2022, 3045, 3045, 3045, 3045)
date <- c('2013-01-01', '2013-01-01', '2013-01-02', '2013-02-04', '2013-02-01', '2013-02-02', '2013-02-02', '2013-01-04', '2013-05-01', '2013-06-01',  '2013-07-01', '2013-07-01')
sequential.days <- c(1,1,2,1,1,2,2,1,1,1,1,1)
df <- cbind(id, date, sequential.days)

1 个答案:

答案 0 :(得分:0)

这是一个data.table解决方案:

# convert to data.table
library(data.table)
DT <- data.table(df)

# make sure `date` is in fact a date and not a string
DT[, date := as.Date(date)]

# re order
DT <- setkey(DT[order(date)], id)

# compute diffs
DT[, diffs := c(0, diff(date)), by=id]

## We will use cumsum.  Anything greater than 1, should be reset to 0
DT[diffs > 1, diffs := 0]

# add one to each value
DT[, diffs := diffs + 1]

# fix duplicate dates
DT[, diffs := max(diffs), by=list(id, date)]

结果

DT

      id       date sequential.days diffs
 1: 1030 2013-01-01               1     1
 2: 1030 2013-01-01               1     1
 3: 1030 2013-01-02               2     2
 4: 1030 2013-02-04               1     1
 5: 2022 2013-01-04               1     1
 6: 2022 2013-02-01               1     1
 7: 2022 2013-02-02               2     2
 8: 2022 2013-02-02               2     2
 9: 3045 2013-05-01               1     1
10: 3045 2013-06-01               1     1
11: 3045 2013-07-01               1     1
12: 3045 2013-07-01               1     1