Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R中是否有一个合适的循环用于计算旅程中接触点的数量,并将最终销售点变量放置在最后一个接触点?_R_Loops_Dataframe_While Loop_Time Series - Fatal编程技术网

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 package
anytime
,这解决了错误!它工作起来很有魅力,谢谢!不需要软件包。只需将时间戳转换为合适的日期即可/来自factor的时间类型:
as.POSIXct(as.character(df$Timestamp))
谢谢!但是,我确实收到了一个与乔尼·菲尔普斯的建议类似的错误:
'max'对factors没有意义
。有什么建议吗?更新:使用了package
随时
,这就解决了错误!它像一个符咒一样工作,谢谢!不需要软件包。只需将时间戳从factor:转换为适当的日期/时间类型即可e> as.POSIXct(as.character(df$Timestamp))