我有一个看起来像这样的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"。
答案 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}}版本一起使用的方法功能