我有一个data.frame看起来像这样:
IsLead ID Path LogTime PathCode Conversion
0 198822 2015-06-19 01:57:11.000 J ConvA
0 198822 2015-06-19 01:58:33.000 F ConvA
1 198822 2015-06-19 02:07:01.000 H ConvA
0 253547 2015-06-20 07:52:33.000 A ConvD
1 253547 2015-06-20 07:52:33.000 H ConvD
2 351754 2015-06-20 07:52:33.000 J
2 351754 2015-06-20 07:52:33.000 A
Run Code Online (Sandbox Code Playgroud)
IsLead表示行是否要转换,0表示路径上的交互,而1表示实际转换点。2表示路径将不转换。
ID路径表示唯一路径。因此,每个路径为0的路径必须包含1。每个路径为2的路径仅包含2。
LogTime指示交互时间。
PathCode指示交互的类型。其中H表示发生转换的交互,因此IsLead 1始终为PathCode H,并表示ID路径已完成。
转换指示转换发生在哪个转换点。
对行进行排序以确保您遵循每个ID路径路径,并且它们不会彼此缠绕在一起
我想更改我的data.frame,所以它看起来像这样:
ID Path Lead Path Conversion
198822 1 JFH ConvA
253547 1 AH ConvD
351754 0 JA
Run Code Online (Sandbox Code Playgroud)
因此,对于每个ID路径,已经按照正确的顺序合并了PathCode。对于具有转换的每个路径,LEAD为1,如果没有转换,则LEAD为0。
如果可能的话,我希望显示的路径列不带“ H”,因此这种情况下的路径为:“ JF”,“ A”,“ JA”。
这是一个可能的data.table解决方案(我假设数据已经排序,可以不添加,可以添加order(LogTime)到ith表达式中)
library(data.table)
setDT(df)[, .(Lead = +all(Conversion != ''),
Path = gsub('H', "", paste(PathCode, collapse = ""), fixed = TRUE)),
by = .(ID.Path, Conversion)]
# ID.Path Conversion Lead Path
# 1: 198822 ConvA 1 JF
# 2: 253547 ConvD 1 A
# 3: 351754 0 JA
Run Code Online (Sandbox Code Playgroud)
或类似地 dplyr
library(dplyr)
df %>%
group_by(ID.Path, Conversion) %>%
summarise(Lead = +all(Conversion != ''),
Path = paste(PathCode, collapse = "")) %>%
mutate(Path = gsub('H', "", Path, fixed = TRUE))
# Source: local data frame [3 x 4]
# Groups: ID.Path
#
# ID.Path Conversion Lead Path
# 1 198822 ConvA 1 JF
# 2 253547 ConvD 1 A
# 3 351754 0 JA
Run Code Online (Sandbox Code Playgroud)