基于多个标准的平均时差

时间:2014-02-03 18:47:02

标签: r excel

我有一个数据集,其中包含特定日期的时间戳销售信息,适用于多个零售商和产品类型。此外,它是一个多产品自动售货机,可以通过多种方式初始化交易。

以下是有机组织的一小部分示例:

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能力,我似乎​​无法找到好的文档(主要是因为我可能没有找到合适的位置)。

谢谢!

3 个答案:

答案 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]