我想在data.table
中传递一个行号,但是,我想根据conv的条件为0且每个事件先验将按ID计数-1。
id group event
1 a click
2 a click
3 a conv
4 b click
5 b conv
输出如下:
id group event num
1 a click -2
2 a click -1
3 a conv 0
4 b click -1
5 b conv 0
答案 0 :(得分:3)
我使用了which.max
,所以在有两个conv
的情况下,正计数从第一个开始。 seq(.N)
等同于row_number()
中的dplyr
。
library(data.table)
setDT(df)
df[, num := seq(.N) - which.max(event == 'conv'), group]
# id group event num
# 1: 1 a click -2
# 2: 2 a click -1
# 3: 3 a conv 0
# 4: 4 b click -1
# 5: 5 b conv 0
答案 1 :(得分:2)
一个dplyr
替代方案,假设每个组只有一个“转换”。我们可以通过在组中找到“ conv”的索引减去当前的row_number()
。当组中的行“ conv”以外的行也可以使用。
library(dplyr)
df %>%
group_by(group) %>%
mutate(num = row_number() - which(event == "conv"))
# id group event num
# <int> <fct> <fct> <int>
#1 1 a click -2
#2 2 a click -1
#3 3 a conv 0
#4 4 b click -1
#5 5 b conv 0