R 如何计算距下次事件发生的天数?

R 如何计算距下次事件发生的天数?,r,mutate,R,Mutate,使用类似的数据集提出了另一个问题,但问题不同- 我有一个数据集,它是一个日期列表,后跟一列,其中“R”表示常规日期,而“S”表示特殊日期: date <- c('01/01', '01/02', '01/03', '01/04', '01/05', '01/06', '01/07', '01/08', '01/09') day <- c('S', 'R', 'R', 'R', 'R', 'S', 'R', 'R', 'S') data <- data.frame(date,

使用类似的数据集提出了另一个问题,但问题不同-

我有一个数据集,它是一个日期列表,后跟一列,其中“R”表示常规日期,而“S”表示特殊日期:

date <- c('01/01', '01/02', '01/03', '01/04', '01/05', '01/06', '01/07', '01/08', '01/09')

day <- c('S', 'R', 'R', 'R', 'R', 'S', 'R', 'R', 'S')

data <- data.frame(date, day)
现在,我试图添加一个列,指出离下一个“特殊”日还有多少天。因此,对于显示的数据,它应该是0(01/01是特殊的),4(01/02是距离下一个特殊的日子01/06还有4天),3,2,1,0(01/06是特殊的),等等


谢谢

这里是一个基于R的想法。当一天是
S
时,使用
cumsum
创建组,取每个组的长度序列,并将最大值(对应于
S
)替换为0,即

i1 <- cumsum(data$day == 'S')
data$res <- ave(i1, i1, FUN = function(i) { i2 <- seq_along(i); rev(replace(i2, max(i2), 0)) })

这是一种
dplyr
方法。您可以使用
cumsum
将特殊日期前的天数组合在一起,然后通过计算天数
n()
并减去组中的行号
row\u number()
进行倒计时

library(dplyr)

data %>%
  group_by(grp = cumsum(lag(day, default = first(day)) == 'S')) %>%
  mutate(days_until = n() - row_number())
输出

# A tibble: 9 x 4
# Groups:   grp [3]
  date  day     grp days_until
  <fct> <fct> <int>      <int>
1 01/01 S         1          0
2 01/02 R         2          4
3 01/03 R         2          3
4 01/04 R         2          2
5 01/05 R         2          1
6 01/06 S         2          0
7 01/07 R         3          2
8 01/08 R         3          1
9 01/09 S         3          0
#一个tible:9 x 4
#组别:grp[3]
截止日期
01/01 S 10
2 01/02 R 2 4
3 01/03 R 2 3
04年01月4日第2条
5 01/05 R 2 1
06年01月6日第20页
2007年1月7日R 3 2
8 01/08 R 3 1
9 01/09 S 3 0

也谢谢,刚刚看到本的答案!感激
library(dplyr)

data %>%
  group_by(grp = cumsum(lag(day, default = first(day)) == 'S')) %>%
  mutate(days_until = n() - row_number())
# A tibble: 9 x 4
# Groups:   grp [3]
  date  day     grp days_until
  <fct> <fct> <int>      <int>
1 01/01 S         1          0
2 01/02 R         2          4
3 01/03 R         2          3
4 01/04 R         2          2
5 01/05 R         2          1
6 01/06 S         2          0
7 01/07 R         3          2
8 01/08 R         3          1
9 01/09 S         3          0