1

我对 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)
4

1 回答 1

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
于 2013-07-02T17:48:41.397 回答