将阶段列添加到我的 R data.frame

Adding a stage column to my R data.frame

我想在我的 R 数据框中添加一个阶段列。使用 JMP,我会用一个列公式递归地解决这个问题,我认为它会翻译成类似这样的东西:

mutate(group_by(df, experiment_id),
  stage = ifelse(row_number(setpoint) == 1, 1,
      ifelse(lead(setpoint, 1) != setpoint,
             lag(stage, 1) + 1,
             lag(stage, 1))))

但是,这种方法不适用于 dplyr 并且似乎有一个 buglaggroup_by,所以我想知道如何编写一个函数对于 dplyr 这会为我增加阶段:

mutate(example, stage = stage(setpoint1, setpoint2))

这里的stage函数接受一到n个连续的设定点变量,当其中任何一个发生变化时,都会增加阶段。例如,

example <-
    data_frame(n=1:10,
               sp1=c(rep(3, 3), rep(5, 4), rep(8, 3)),
               sp2=c(rep(1, 3), rep(2, 2), rep(5, 5)))
mutate(example, stage = stage(sp1, sp2))

这应该给出:

|    |  n | sp1 | sp2 | stage |
|----+----+-----+-----+-------|
|  1 |  1 |   3 |   1 | 1     |
|  2 |  2 |   3 |   1 | 1     |
|  3 |  3 |   3 |   1 | 1     |
|  4 |  4 |   5 |   2 | 2     |
|  5 |  5 |   5 |   2 | 2     |
|  6 |  6 |   5 |   5 | 3     |
|  7 |  7 |   5 |   5 | 3     |
|  8 |  8 |   8 |   5 | 4     |
|  9 |  9 |   8 |   5 | 4     |
| 10 | 10 |   8 |   5 | 4     |

我的数据由几天内定期抽样的实验组成,因此阶段索引需要从 1 开始连续。group_indices 似乎在分配组时对数据进行了排序,并且看起来是不是通过稍微更改示例可以看到所有阶段:

> example <-
+     data_frame(n=1:10,
+                sp1=c(rep(8, 3), rep(3, 4), rep(8, 3)),
+                sp2=c(rep(3, 3), rep(2, 2), rep(1, 5)))
> example %>% mutate(stage = group_indices(., paste0(sp1, sp2)))
Source: local data frame [10 x 4]

    n sp1 sp2 stage
1   1   8   3     4
2   2   8   3     4
3   3   8   3     4
4   4   3   2     2
5   5   3   2     2
6   6   3   1     1
7   7   3   1     1
8   8   8   1     3
9   9   8   1     3
10 10   8   1     3

更新

经过聊天讨论,我们发现可行的解决方案是:

example %>% 
  mutate(x = paste0(sp1, sp2), 
         stage = cumsum(x != c(0, head(x, -1)))) %>% 
  select(-x)