2012-03-01 58 views
2

如果我有一些多变量不规则时间序列,例如与动物园或XTS对象:如何在R中的不规则时间序列上产生简单的滑动窗口特征?

> 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 

我可以写一些代码来产生上述数据的简单featurization与每一个行中的数据帧(用户,日)的所有天(最多到用户的第一次购买的日),以及与这些列:

  • 项目我的#点击在过去7天
  • #i和31之间的7项的点击days ago
  • #total pas牛逼点击
  • 同为项目j
  • 相同的下载F,G
  • 是否在接下来的7天内

不过,我很好奇,是否有方便,美观发生申购,使用任何不同的时间序列操作包都可以达到这个目的。我环顾动物园和xts的东西,但我没有发现任何有希望的东西。

+0

我可以发誓我几个月前就看到了这个问题,但是找不到它。离开我的头顶,在日期栏中应用'diff'并在项目列中选择匹配的数据看起来非常紧凑和快速。 – 2012-03-01 13:01:04

+1

不要'rollapply'做你想要的吗? – 2012-03-01 13:18:26

+0

你也可以看看'lubridate'及其持续时间或阶段类。但是这需要一个日期向量而不是'动物园'或'xts'对象。 – Justin 2012-03-01 15:14:21

回答

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

+0

感谢您的回答,但请参阅我上面的评论 - 您无法为此数据创建常规时间序列,因为这些事件实际上并不是在日级粒度上发生的。即使这样,稀疏也会导致资源使用过多。对不起,如果我草拟的示例数据是这样误导的。 – Yang 2012-03-02 03:17:24

+0

时间序列保持不规则。我编辑了我的答案,使用时间而不是日期来说清楚。 – 2012-03-02 03:42:07

+0

明白了,谢谢澄清!另一个直接的问题是有数百万用户,因此遍历所有用户并扫描整个表格以为每个用户选择相关的行是非常昂贵的。我会接受你的回答,因为这可能和没有自定义低级代码一样好。 – Yang 2012-03-02 07:47:45

相关问题