如果我有一些多元不规则时间序列,比如zoo或xts对象,带有:
> clicks
user item
2003-01-02 a i
2003-01-03 a i
2003-01-08 b i
2003-01-09 a j
2003-01-09 c j
2003-01-10 b j
> downloads
user file
2003-01-08 a f
2003-01-11 b g
2003-01-11 b f
> purchases
user
2003-01-10 a
2003-01-16 b
我可以写一些代码,将上述数据简单地格式化为一个数据帧,其中每(用户,天)一行,用于所有天(直到用户第一次购买的那一天),并使用以下列:
- #项目i在过去7天内的点击量
- #在7到31天前点击项目i
- #过去的总点击量
- 与项目j相同
- 下载f,g也是如此
- 是否在接下来的7天内进行购买
然而,我很好奇是否有简单、优雅、而且速度不慢的方法可以使用各种时间序列操作包来实现这一点。我四处看了看动物园和xts的东西,但没有发现任何有希望的东西。
您可以表示每种类型的事件(例如,"用户A单击项目i")作为每次出现值为1的时间序列x
。你感兴趣的数量可以从cumsum(x)
中计算出来(截至今天的事件数量)及其翻译(过去或未来k天之前的事件数)。
# Sample data
set.seed(0)
k <- 100
users <- LETTERS[1:4]
files <- letters[1:4]
items <- letters[24:26]
clicks <- data.frame(
time = Sys.time() + runif(k, 0, k * 24 * 3600),
user = sample( users, k, replace=TRUE ),
item = sample( items, k, replace=TRUE )
)
clicks <- unique(clicks)
对于单个时间序列:
x <- subset( clicks, user=="C" & item=="x" )
xts( rep(1,nrow(x)), x$time )
x <- xts( rep(1,nrow(x)), x$time )
y <- xts( coredata(x), index(x)+7*3600*24 )
z <- cbind(y, x)
z[ is.na(z) ] <- 0
cumsum(z[,2]) - cumsum(z[,1])
# cbind(x,z,cumsum(z[,2]) - cumsum(z[,1]))
对于整个数据集,可以使用ddply
。