dplyr 在每个基于组的捆绑行中以单调递增的值进行变异
dplyr mutate with a monotonically increasing value within each group based bundling rows
我有一个这样的数据框,其中 ID 是主要分组变量,类型代表交易类型。 Type 'a' 是 type 'b' 事务的前身。我希望能够为每个 ID 形成的 'group' 中的所有 ([a]+[b]{1}) 模式分配唯一的交易 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
生成的数据框应该是这样的,尽管这里的 tid 值是任意的,只需要在整个组中的每个 'transaction group' 中是一些唯一的 ID。
> 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
>
我编写的部分代码使我 'mostly' 朝着正确的方向前进,但我不知道如何使用单调递增的值而不是我当前分配的二进制值进行变异。
df %>% group_by(id) %>% mutate(tid = ifelse(is.na(lag(type)) | lag(type) == 'a' | (type == 'b' & lag(type) == 'a'), 1, 0))
我需要能够使用递增的变量进行变异。
你可以试试
library(dplyr)
df %>% group_by(id) %>%
mutate(tid= sprintf("%03d", head(cumsum(c(F, type=="b")), -1)))
我有一个这样的数据框,其中 ID 是主要分组变量,类型代表交易类型。 Type 'a' 是 type 'b' 事务的前身。我希望能够为每个 ID 形成的 'group' 中的所有 ([a]+[b]{1}) 模式分配唯一的交易 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
生成的数据框应该是这样的,尽管这里的 tid 值是任意的,只需要在整个组中的每个 'transaction group' 中是一些唯一的 ID。
> 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
>
我编写的部分代码使我 'mostly' 朝着正确的方向前进,但我不知道如何使用单调递增的值而不是我当前分配的二进制值进行变异。
df %>% group_by(id) %>% mutate(tid = ifelse(is.na(lag(type)) | lag(type) == 'a' | (type == 'b' & lag(type) == 'a'), 1, 0))
我需要能够使用递增的变量进行变异。
你可以试试
library(dplyr)
df %>% group_by(id) %>%
mutate(tid= sprintf("%03d", head(cumsum(c(F, type=="b")), -1)))