2012-03-01 62 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

相關問題