将一个stage列添加到我的R data.frame中

时间:2015-02-23 21:30:18

标签: r dplyr

我想在我的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

1 个答案:

答案 0 :(得分:1)

更新

在聊天讨论后,我们发现工作解决方案是:

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