我对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)
答案 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