分组数据上的条件 seq_along

Something like conditional seq_along on grouped data

我正在尝试生成 'episodes' 观察结果,将观察结果分组在一起 </= 相隔 14 天的观察结果。 使用 dplyr 我已经设法计算出自上次观察以来的天数。但是,我无法弄清楚如何在没有 for 循环的情况下根据条件 </= 14 获取新 ID。

示例数据:

#obsvn is number of days since first observation in group

dat <- data.frame(id = c(rep("A",5), rep("B", 2)), 
                  obsvn = c(1, 2, 29, 30, 45, 1, 15))
  id obsvn
1  A     1
2  A     2
3  A    29
4  A    30
5  A    45
6  B     1
7  B    15

预期输出:

  id obsvn ith
1  A     1    1
2  A     2    1
3  A    29    2
4  A    30    2
5  A    45    3
6  B     1    1
7  B    15    2

我试过使用延迟

dat <- dat %>% 
  group_by(id) %>% 
  mutate(ith = 1,
         ith = ifelse(obsvn - lag(obsvn) <= 14, lag(ith), lag(ith)+1))
dat
Source: local data frame [7 x 3]
Groups: id

  id obsvn ith
1  A     1  NA
2  A     2   1
3  A    29   2
4  A    30   1
5  A    45   2
6  B     1  NA
7  B    15   1

这不是我想要的。我不明白为什么第 4 行的 ith 是 1 而不是 2。

因为它返回 lag(ith),它始终为 1(或开头为 NA)。

我会使用 diffcumsum:

dat %>% group_by(id) %>% mutate(ith = cumsum(c(1,diff(obsvn)>=14)))
Source: local data frame [7 x 3]
Groups: id

  id obsvn ith
1  A     1   1
2  A     2   1
3  A    29   2
4  A    30   2
5  A    45   3
6  B     1   1
7  B    15   2