如何在R中生成不规则时间序列的简单滑动窗口特征?

时间:2012-03-01 10:30:40

标签: r time-series

如果我有一些多变量不规则时间序列,例如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

我可以编写一些代码,将上述数据的简单特征产生到一个数据框中,每天(用户,每天)一行(直到用户第一次购买的那一天),并使用以下列:

  • 过去7天内对项目i的点击次数
  • 在7到31天之前点击项目i
  • #总过去点击次数
  • 项目j
  • 相同
  • 同样适用于下载f,g
  • 是否在接下来的7天内购买

但是,我很好奇是否有使用各种时间序列操作包完成此操作的简单,优雅和非痛苦的方法。我环顾了动物园和xts的东西,但我没有找到任何有希望的东西。

1 个答案:

答案 0 :(得分:0)

您可以代表每种类型的事件(例如,“用户A点击项目i”) 作为时间序列x,每次出现时值为1。 您感兴趣的数量可以从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