我有一个数据集,其中包含特定日期的时间戳销售信息,适用于多个零售商和产品类型。此外,它是一个多产品自动售货机,可以通过多种方式初始化交易。
以下是有机组织的一小部分示例:
retailer session eventtype timestamp
123 1 1 5:15:09
123 1 3 5:15:13
123 2 1 5:16:21
123 2 3 5:16:33
123 3 2 5:16:59
123 3 1 5:17:04
123 3 6 5:17:22
555 1 2 6:45:32
555 1 3 6:45:46
555 2 1 6:56:02
555 2 3 7:02:21
929 4 1 3:21:23
929 4 6 3:22:09
因此,零售商123有3个会话,每个会话中有几个不同的事件(插入资金,正在进行销售,兑换优惠券等)。
我想知道的是,所有零售商的整体会话之间的平均时间是多少。那么,当会话更改为新的号码时,在同一个零售商处,在两者之间传递了多少秒/分钟?
另外,我希望能够玩它 - 什么是stdev?会话之间的时间是否有差异,具体取决于会话是以1还是3类型事件开始的?如果我只想完全忽略以事件类型2开头的会话怎么办?
对于详细的请求感到抱歉,但这超出了我的R能力,我似乎无法找到好的文档(主要是因为我可能没有找到合适的位置)。
谢谢!
答案 0 :(得分:1)
这是base
R替代品。
# convert timestamp to as.POSIXct object
df$time <- as.POSIXct(paste(Sys.Date(), df$timestamp))
# create an index of session change for each retailer
df$change <- with(df, ave(session, retailer, FUN = function(x){
c(0, diff(x))
}))
# for each retailer, calculate time difference between first time of new session
# and time of the previous row
diffs <- by(data = df, df$retailer, function(x){
difftime(x$time[x$id == 1], x$time[which(x$id == 1) - 1], units = "secs")
})
diffs
# df$retailer: 123
# Time differences in secs
# [1] 68 26
# attr(,"tzone")
# [1] ""
# ---------------------------
# df$retailer: 555
# Time difference of 616 secs
# ---------------------------
# df$retailer: 929
# Time difference of secs
# overall mean of time differences between sessions
mean(unlist(diffs))
# [1] 236.6667
答案 1 :(得分:0)
我觉得这里的问题很有意思(商业方面)但不幸的是, 如果没有提供您尝试的内容或至少预期的输出,您会提出很多要求。
你可以像这样开始:
library(data.table)
DT <- as.data.table(dat)
## coerce to ITime
DT[,ntime := lapply(paste0(0,timestamp),as.ITime)]
## I compute the duration of each session by retailer
## then I compute the mean by retailer
DT[,tail(ntime,1)[[1]]-head(ntime,1)[[1]],"retailer,session"][
,list(meansessionTime=mean(V1)),retailer]
retailer meansessionTime
1: 123 13.0
2: 555 196.5
3: 929 46.0
编辑 OP正在寻找会话之间的时间而非会议时间:
DT[, ntime := as.POSIXct(paste(Sys.Date(), timestamp))]
DT[,btw:= {xx=c(0,diff(ntime))
ifelse(c(0,diff(session))==1,xx,0)},retailer]
mean(DT[btw!=0,btw])
[1] 236.6667
答案 2 :(得分:0)
这是一个计算会话之间时间的答案。这应该涵盖会话不连续的可能性:
df$timestamp <- as.POSIXct(df$timestamp, format="%H:%M:%s")
dt.max <- data.table(df)[, max(timestamp), by=list(retailer, session)]
dt.min <- data.table(df)[, min(timestamp), by=list(retailer, session)]
dt.min[, session:=session - 1]
dt.max <- dt.max[dt.max[, session != max(session), by=list(retailer)]$V1]
setkey(dt.max, retailer, session)
dt.deltas <- dt.max[dt.min, roll=T]
dt.deltas[complete.cases(dt.deltas), list(avg=mean(V1.1 - V1), stdv=sd(V1.1 - V1)), by=retailer]