类似于分组数据的条件seq_along

r.b*_*bot 0 r dplyr

我正试图产生观察的"情节",将观察结果组合在一起,它们</=相隔14天发生.有了dplyr,我设法计算了自上次观察以来的天数.但是,我无法弄清楚如何在</= 14没有for循环的情况下基于条件获取新的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
Run Code Online (Sandbox Code Playgroud)

预期产量:

  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
Run Code Online (Sandbox Code Playgroud)

我尝试过使用滞后

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
Run Code Online (Sandbox Code Playgroud)

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

Jam*_*mes 6

因为它正在返回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
Run Code Online (Sandbox Code Playgroud)