我想在我的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,似乎bug有lag
和group_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
答案 0 :(得分:1)
在聊天讨论后,我们发现工作解决方案是:
example %>%
mutate(x = paste0(sp1, sp2),
stage = cumsum(x != c(0, head(x, -1)))) %>%
select(-x)