R中是否有一个合适的循环用于计算旅程中接触点的数量,并将最终销售点变量放置在最后一个接触点?
我正在使用一个客户旅程数据集,该数据集需要转换为日级别的时间序列数据。要简要概述数据,请执行以下操作:R中是否有一个合适的循环用于计算旅程中接触点的数量,并将最终销售点变量放置在最后一个接触点?,r,loops,dataframe,while-loop,time-series,R,Loops,Dataframe,While Loop,Time Series,我正在使用一个客户旅程数据集,该数据集需要转换为日级别的时间序列数据。要简要概述数据,请执行以下操作: PurchaseID Timestamp Touchpoint Purchase 1 2015-08-07 19:16:59 1 1 1 2015-11-03 12:31:35 7 1 1 2015-1
PurchaseID Timestamp Touchpoint Purchase
1 2015-08-07 19:16:59 1 1
1 2015-11-03 12:31:35 7 1
1 2015-11-03 12:39:22 3 1
2 2015-11-24 22:29:39 1 0
2 2016-05-21 08:39:44 1 0
2 2016-06-15 15:48:20 4 0
...
PurchaseID中的每个唯一编号都是一次旅程。这里的问题是,对于每个导致购买的旅程,购买在旅程中的每个接触点都有一个1。我想将其更改为只有1的最终接触点,作为销售点,如下所示:
PurchaseID Timestamp Touchpoint Purchase POS
1 2015-08-07 19:16:59 1 1 0
1 2015-11-03 12:31:35 7 1 0
1 2015-11-03 12:39:22 3 1 1
2 2015-11-24 22:29:39 1 0 0
2 2016-05-21 08:39:44 1 0 0
2 2016-06-15 15:48:20 4 0 0
...
我推断,最简单的方法是创建一个循环来填充一个新的可变行程长度(我以后也可以使用它进行分析),它计算行程中的步数。例如:
PurchaseID Timestamp Touchpoint Purchase JourneyLength
1 2015-08-07 19:16:59 1 1 1
1 2015-11-03 12:31:35 7 1 2
1 2015-11-03 12:39:22 3 1 3
...
使用新的循环,每个唯一PurchaseID的最大值可用于在POS中填充最后一个(因此是最大值)行程步骤的一个值(如果有购买)
到目前为止,我所尝试的并没有得到我想要的结果:
CJDsub$JLength%summary(
时间戳以下是我如何使用数据来处理它。表
包:
library(data.table)
# data, convert to data.table
df <- data.frame(PurchaseId=c(rep(1,3), rep(2,3)),
Timestamp=1:6,
Touchpoint=c(1,7,3),
Purchase=c(rep(1,3), rep(0,3)))
dt <- as.data.table(df)
# create template value
dt[, POS := 0]
# find maximum timestamp and store
dt[, Max.Timestamp := max(Timestamp), by=PurchaseId]
# where timestamp is maximal and purchase has been made, then set to 1
dt[Timestamp == Max.Timestamp & Purchase > 0, POS := 1]
# clean
dt[, Max.Timestamp := NULL]
out.df <- as.data.frame(dt)
out.df
库(data.table)
#数据,转换为data.table
df以下是我如何使用数据来处理它。表
包:
library(data.table)
# data, convert to data.table
df <- data.frame(PurchaseId=c(rep(1,3), rep(2,3)),
Timestamp=1:6,
Touchpoint=c(1,7,3),
Purchase=c(rep(1,3), rep(0,3)))
dt <- as.data.table(df)
# create template value
dt[, POS := 0]
# find maximum timestamp and store
dt[, Max.Timestamp := max(Timestamp), by=PurchaseId]
# where timestamp is maximal and purchase has been made, then set to 1
dt[Timestamp == Max.Timestamp & Purchase > 0, POS := 1]
# clean
dt[, Max.Timestamp := NULL]
out.df <- as.data.frame(dt)
out.df
库(data.table)
#数据,转换为data.table
df考虑ave
计算最长日期,然后有条件地使用ifelse
分配Pos:
df <- within(df, {
MaxDate <- ave(Timestamp, PurchaseID, FUN=max)
POS <- ifelse(Timestamp == MaxDate & Purchase == 1, 1, 0)
rm(MaxDate)
})
df
# PurchaseID Timestamp Touchpoint Purchase POS
# 1 1 2015-08-07 19:16:59 1 1 0
# 2 1 2015-11-03 12:31:35 7 1 0
# 3 1 2015-11-03 12:39:22 3 1 1
# 4 2 2015-11-24 22:29:39 1 0 0
# 5 2 2016-05-21 08:39:44 1 0 0
# 6 2 2016-06-15 15:48:20 4 0 0
df考虑ave
计算最长日期,然后有条件地使用ifelse
分配Pos:
df <- within(df, {
MaxDate <- ave(Timestamp, PurchaseID, FUN=max)
POS <- ifelse(Timestamp == MaxDate & Purchase == 1, 1, 0)
rm(MaxDate)
})
df
# PurchaseID Timestamp Touchpoint Purchase POS
# 1 1 2015-08-07 19:16:59 1 1 0
# 2 1 2015-11-03 12:31:35 7 1 0
# 3 1 2015-11-03 12:39:22 3 1 1
# 4 2 2015-11-24 22:29:39 1 0 0
# 5 2 2016-05-21 08:39:44 1 0 0
# 6 2 2016-06-15 15:48:20 4 0 0
df谢谢你的回答!我用原始时间戳尝试了你的解决方案,但没有成功,得到了这个错误>dt[,max.timestamp:=max(timestamp),by=PurchaseID]错误摘要。因子(347214L,na.rm=FALSE):“max”对于后来使用JJJ mm dd表示法尝试的因子没有意义,它确实起作用,但给出了错误的结果,因为一些接触点在同一天,导致多次得到1而不是最后一个。如何解决此问题?as.Date
迄今为止不起作用更新,用软件包解决了时间问题anytime
。现在可以了。谢谢你的回答!我用原始时间戳尝试了你的解决方案,但没有成功,得到了这个错误>dt[,max.timestamp:=max(timestamp),by=PurchaseID]错误摘要。因子(347214L,na.rm=FALSE):“max”对于后来使用JJJ mm dd表示法尝试的因子没有意义,它确实起作用,但给出了错误的结果,因为一些接触点在同一天,导致多次得到1而不是最后一个。如何解决此问题?as.Date
迄今为止不起作用更新,用软件包解决了时间问题anytime
。它现在可以工作了。谢谢!但是,我确实收到了一个与乔尼·菲尔普斯的建议类似的错误:“max”对因子没有意义
。有什么建议吗?更新:used packageanytime
,这解决了错误!它工作起来很有魅力,谢谢!不需要软件包。只需将时间戳转换为合适的日期即可/来自factor的时间类型:as.POSIXct(as.character(df$Timestamp))
谢谢!但是,我确实收到了一个与乔尼·菲尔普斯的建议类似的错误:'max'对factors没有意义
。有什么建议吗?更新:使用了package随时
,这就解决了错误!它像一个符咒一样工作,谢谢!不需要软件包。只需将时间戳从factor:转换为适当的日期/时间类型即可e> as.POSIXct(as.character(df$Timestamp))