2012-12-05 24 views
3

我有一個交易樣本 - 客戶ID,交易DATE,交易VALUE(每天最多一筆交易)...全部按ID排序,然後按DATE排序。是否有刪除所有交易的矢量化方式,但是每個客戶ID的最近N?

我只需要爲每個客戶保留最近的N交易(比如最新的3個)。有沒有矢量化的方式來做到這一點?在原始示例中,我有數百萬個事務 - FOR循環執行時間過長。

ID DATE VALUE 
205 18.10.2010 19 
209 30.09.2010 19 
209 21.10.2010 19 
209 07.11.2010 19 
228 08.11.2010 159 
237 24.10.2010 159 
237 13.11.2010 200 
248 30.09.2010 25 
274 05.10.2010 19 
274 11.10.2010 10 
274 25.10.2010 19 
274 05.11.2010 19 
292 25.09.2010 159 
292 03.10.2010 159 
292 10.10.2010 159 
292 26.10.2010 159 
292 07.11.2010 159 
310 18.10.2010 19 
310 07.11.2010 19 
310 19.11.2010 19 
354 23.10.2010 19 
354 02.11.2010 19 
354 14.11.2010 19 
354 22.11.2010 19 
368 18.10.2010 19 
369 25.09.2010 25 
369 26.09.2010 25 
369 27.09.2010 25 
369 02.10.2010 25 
369 04.10.2010 159 
369 11.10.2010 20 
369 15.10.2010 10 
369 16.10.2010 19 
369 23.10.2010 10 
369 26.10.2010 10 
369 29.10.2010 10 
369 01.11.2010 10 
369 02.11.2010 30 
369 08.11.2010 10 
369 13.11.2010 20 
369 15.11.2010 70 
369 23.11.2010 20 
375 14.11.2010 159 
382 11.10.2010 18 
382 16.11.2010 20 
387 26.10.2010 19 
407 26.09.2010 25 
407 04.10.2010 25 
407 10.10.2010 70 
407 25.10.2010 19 
+0

你甚至有你的數據在R嗎?這是[r]標籤中最常見的問題。你有什麼嘗試? – GSee

+0

發佈'dput(mydata)'(或者你的數據框是什麼)會使這個問題重現並且更容易回答。 –

+0

上面的示例其實就是我的數據框。約500萬人中有50排。 – dmitryungurean

回答

3

既然你有大量的數據和速度是一個問題,你應該使用data.table

如果您data.frame是在一個名爲dat一個對象,它強制到data.table這樣

DT <- as.data.table(dat) 

由於DATE列的當前格式不容易排序,我們首先創建一個具有實際日期的新列。在data.table包中,:=是參考運算符的分配。

DT[, DATE2:=as.Date(DATE, "%d.%m.%Y")] 

現在我們有一個名爲DATE2的新列與日期。我們可以按日期order,然後拆分 ID並獲取最後3個值(tail(.SD, 3))。 .SD在data.table包代表「數據子集」

> DT[order(DATE2), tail(.SD, 3), by=ID] 
    ID  DATE VALUE  DATE2 
1: 292 10.10.2010 159 2010-10-10 
2: 292 26.10.2010 159 2010-10-26 
3: 292 07.11.2010 159 2010-11-07 
4: 369 13.11.2010 20 2010-11-13 
5: 369 15.11.2010 70 2010-11-15 
6: 369 23.11.2010 20 2010-11-23 
7: 407 04.10.2010 25 2010-10-04 
8: 407 10.10.2010 70 2010-10-10 
9: 407 25.10.2010 19 2010-10-25 
10: 209 30.09.2010 19 2010-09-30 
11: 209 21.10.2010 19 2010-10-21 
12: 209 07.11.2010 19 2010-11-07 
13: 248 30.09.2010 25 2010-09-30 
14: 274 11.10.2010 10 2010-10-11 
15: 274 25.10.2010 19 2010-10-25 
16: 274 05.11.2010 19 2010-11-05 
17: 382 11.10.2010 18 2010-10-11 
18: 382 16.11.2010 20 2010-11-16 
19: 205 18.10.2010 19 2010-10-18 
20: 310 18.10.2010 19 2010-10-18 
21: 310 07.11.2010 19 2010-11-07 
22: 310 19.11.2010 19 2010-11-19 
23: 368 18.10.2010 19 2010-10-18 
24: 354 02.11.2010 19 2010-11-02 
25: 354 14.11.2010 19 2010-11-14 
26: 354 22.11.2010 19 2010-11-22 
27: 237 24.10.2010 159 2010-10-24 
28: 237 13.11.2010 200 2010-11-13 
29: 387 26.10.2010 19 2010-10-26 
30: 228 08.11.2010 159 2010-11-08 
31: 375 14.11.2010 159 2010-11-14 
    ID  DATE VALUE  DATE2 

或者,你可以設置一個key

這將是等效的,但也許更快

setkey(DT, DATE2, ID) 
DT[, tail(.SD, 3), by=ID] 
+0

其實,當你說「最後3」時,我敢打賭你的意思是按日期排列,而且看起來你的數據沒有按日期排序。所以,你需要先做到這一點。但是,這是DATE的一種尷尬格式。 – GSee

+0

是的,它確實是DATE的最後3個。樣本首先按ID排序,然後按DATE排序。我會立即檢查data.table。謝謝。 – dmitryungurean

+0

@dmitryungurean,'data.table'軟件包使用的語法需要一點時間才能習慣,但如果您使用大數據,這是非常值得的。一旦你習慣了它,我想你會發現它更優雅。另外,您從data.table開發人員(以及幫助文檔,短片等)獲得的支持水平是一流的。 – GSee

相關問題