在R中按条件将行合并在一起

Kha*_*idN 2 merge r

我有一个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”。

Dav*_*urg 5

这是一个可能的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)