将阶段列添加到我的 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 并且似乎有一个 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
更新
经过聊天讨论,我们发现可行的解决方案是:
example %>%
mutate(x = paste0(sp1, sp2),
stage = cumsum(x != c(0, head(x, -1)))) %>%
select(-x)
我想在我的 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
更新
经过聊天讨论,我们发现可行的解决方案是:
example %>%
mutate(x = paste0(sp1, sp2),
stage = cumsum(x != c(0, head(x, -1)))) %>%
select(-x)