dplyr在每个基于捆绑行的组内以单调递增的值进行变异

时间:2015-08-05 17:51:18

标签: r dplyr

我有一个数据框,例如这个数据框,其中ID是主要的分组变量,类型代表一种事务类型。类型'a'是输入'b'事务的前兆。我希望能够为每个ID形成的“组”中的所有([a] + [b] {1})模式分配唯一的事务ID。

_unchecked_make_list

结果数据框应该如下所示,尽管tid值在这里是任意的,只需要在整个组中的每个“事务组”中都是一个唯一的ID。

> df <- data.frame(id = c(1, 1, 1, 1, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4), type =     c('a', 'a', 'b', 'a', 'b', 'a', 'b', 'a', 'b', 'a', 'b', 'a', 'a', 'a', 'b'))
> df
   id type
1   1    a
2   1    a
3   1    b
4   1    a
5   1    b
6   2    a
7   2    b
8   3    a
9   3    b
10  3    a
11  3    b
12  4    a
13  4    a
14  4    a
15  4    b

我写了部分代码,让我'大部分'朝着正确的方向发展,但我不知道如何使用单调增加的值而不是我目前正在分配的二进制值进行变异。

> dfnew <- data.frame(id = c(1, 1, 1, 1, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4), type = c('a', 'a', 'b', 'a', 'b', 'a', 'b', 'a', 'b', 'a', 'b', 'a', 'a', 'a', 'b'), tid = c(100, 100, 100, 200, 200, 100, 100, 100, 100, 200, 200, 100, 100, 100, 200))
> dfnew
   id type tid
1   1    a 100
2   1    a 100
3   1    b 100
4   1    a 200
5   1    b 200
6   2    a 100
7   2    b 100
8   3    a 100
9   3    b 100
10  3    a 200
11  3    b 200
12  4    a 100
13  4    a 100
14  4    a 100
15  4    b 100
> 

能够使用增量变量进行变异是我需要的。

1 个答案:

答案 0 :(得分:4)

你可以尝试

library(dplyr)
df %>% group_by(id) %>%
  mutate(tid= sprintf("%03d", head(cumsum(c(F, type=="b")), -1)))