R语言 计算在进行转换时同一客户端ID进行交互的次数

3qpi33ja  于 2023-02-10  发布在  其他
关注(0)|答案(1)|浏览(114)

我有这样一个数据集:
| 客户端ID|相互作用_1|相互作用_2|转化|
| - ------|- ------|- ------|- ------|
| A类|1个|无|无|
| 乙|无|1个|无|
| C级|无|无|1个|
| A类|无|无|1个|
| 乙|无|1个|无|
| 乙|无|无|1个|
| C级|无|1个|无|
| C级|无|无|1个|
数据集已经根据时间戳(升序)排序,交互和转换列都是空的(0/1),对于每个转换,我需要计算client_id进行交互或转换的数量,但自上次转换以来的交互(因此,列"lag_conversion"永远不能〉1)。
输出应如下所示:
| 客户端ID|相互作用_1|相互作用_2|转化|滞后_相互作用_1|滞后相互作用2|滞后转换|
| - ------|- ------|- ------|- ------|- ------|- ------|- ------|
| A类|1个|无|无|无|无|无|
| 乙|无|1个|无|无|无|无|
| C级|无|无|1个|无|无|无|
| A类|无|无|1个|1个|无|无|
| 乙|无|1个|无|无|无|无|
| 乙|无|无|1个|无|第二章|无|
| C级|无|1个|无|无|无|无|
| C级|无|无|1个|无|1个|1个|
我试过密码:

for (i in 1:nrow(mydata)) {
  client_id <- mydata$client_id[i]
  if (mydata$conversion[i] == 1) {
    last_conversion_index <- max(which(mydata$client_id == client_id & mydata$conversion== 1 & 1:nrow(mydata) <= i))
    mydata$interaction_1[i:last_conversion_index & mydata$interaction_1== 1] <- 1
  }
}

尽管这只会在行本身中产生1,这意味着第一行看起来像:
| 客户端ID|相互作用_1|相互作用_2|转化|滞后_相互作用_1|滞后相互作用2|滞后转换|
| - ------|- ------|- ------|- ------|- ------|- ------|- ------|
| A类|1个|无|无|1个|无|无|
任何帮助都是非常感谢!提前感谢

pdtvr36n

pdtvr36n1#

使用dplyr

library(dplyr) #1.1.0 and above
dat %>% 
  mutate(across(everything(), ~ ifelse(conversion == 1, cumsum(lag(.x, default = 0)), 0),
                .names = "lag_{col}"), .by = client_id)

  client_id interaction_1 interaction_2 conversion lag_interaction_1 lag_interaction_2 lag_conversion
1         A             1             0          0                 0                 0              0
2         B             0             1          0                 0                 0              0
3         C             0             0          1                 0                 0              0
4         A             0             0          1                 1                 0              0
5         B             0             1          0                 0                 0              0
6         B             0             0          1                 0                 2              0
7         C             0             1          0                 0                 0              0
8         C             0             0          1                 0                 1              1

低于1.1.0:

dat %>% 
  group_by(client_id) %>%
  mutate(across(everything(), ~ ifelse(conversion == 1, cumsum(lag(.x, default = 0)), 0),
                .names = "lag_{col}")) %>%
  ungroup()

相关问题