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

时间:2015-08-17 07:32:02

标签: r merge

我有一个看起来像这样的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           

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      

所发生的是,对于每个ID路径,PathCode已按正确的顺序合并。对于每个转换路径,LEAD为1,如果没有转换,则为0。

如果可能的话,我希望在没有" H"的情况下显示Path列,因此Path在这种情况下将是:" JF"," A&#34 ;," JA"。

2 个答案:

答案 0 :(得分:5)

这是一个可能的data.table解决方案(我假设数据已经排序,不是,您可以将order(LogTime)添加到i表达式中

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

或类似于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

答案 1 :(得分:2)

您可以使用sqldf库,该库随附有用的group_concat函数(在MySQL中提供):

> require(sqldf)
> df_new <- sqldf("select IDPath, case when Conversion = '' then 0 else 1 end as Lead,
                       Conversion, group_concat(PathCode) PathCode
                   from df
                   group by IDPath", method = "raw")
> df_new$PathCode <- gsub("H|,", "", df_new$PathCode)
> df_new
  IDPath Lead Conversion PathCode
1 198822    1      ConvA       JF
2 253547    1      ConvD        A
3 351754    0                  JA

上述代码假设您的原始数据框称为df。请注意,我必须手动删除PathCode列中的逗号,因为我找不到让SEPARATOR关键字与R {'1}}版本一起使用的方法功能