我有一个交易示例 - 客户 ID
、交易 DATE
、交易 VALUE
(每天最多一次交易)...所有按 ID
然后按 DATE
排序。
我只需要为每个客户保留最近的 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
最佳答案
由于您有大量数据并且速度是个问题,您应该使用 data.table包
如果您的 data.frame
在一个名为 dat
的对象中,像这样将它强制转换为一个 data.table
DT <- as.data.table(dat)
由于 DATE
列的当前格式不容易排序,让我们首先创建一个包含实际日期的新列。在data.table
包中,:=
是引用运算符赋值。
DT[, DATE2:=as.Date(DATE, "%d.%m.%Y")]
现在我们有一个名为 DATE2
的新列,其中包含日期。我们可以按日期排序
,然后按
ID
并获取最后 3 个值 (tail(.SD, 3)
)。 .SD
代表data.table包中的“Subset of Data”
> 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]
关于r - 是否有一种矢量化方法可以删除所有交易,但每个客户 ID 的最近 N 笔交易?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13731725/