首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有一种矢量化的方法来删除除每个客户ID的最新N之外的所有交易?

有没有一种矢量化的方法来删除除每个客户ID的最新N之外的所有交易?
EN

Stack Overflow用户
提问于 2012-12-06 04:23:37
回答 1查看 74关注 0票数 3

我有一个交易样本- customer ID,transaction DATE,transaction VALUE (每天最多一个交易) ...全部按ID排序,然后按DATE排序。

我只需要为每个客户保留最新的N交易(比如最新的3笔)。有没有一种矢量化的方法可以做到这一点?在原始示例中,我有数百万个事务- FOR循环执行时间太长。

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-12-06 05:43:15

由于您有大量的数据,而且速度是个问题,因此您应该使用data.table

如果您的data.frame位于名为dat的对象中,则将其强制为data.table,如下所示

代码语言:javascript
复制
DT <- as.data.table(dat)

由于DATE列的当前格式不容易排序,因此让我们首先创建一个具有实际日期的新列。在data.table包中,:=是引用运算符的赋值。

代码语言:javascript
复制
DT[, DATE2:=as.Date(DATE, "%d.%m.%Y")]

现在我们有了一个名为DATE2的带有日期的新列。我们可以按日期拆分,然后按ID拆分,得到最后3个值(tail(.SD, 3))。.SD代表data.table包中的“数据子集”

代码语言:javascript
复制
> 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

这将是等效的,但可能更快

代码语言:javascript
复制
setkey(DT, DATE2, ID)
DT[, tail(.SD, 3), by=ID]
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13731725

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档