使用rollum并合并两个数据框

时间:2015-12-12 14:03:44

标签: r dplyr plyr

我有两个数据集,购买和联系人。它们只共享用户ID和周数。

联系人表格包含与用户建立联系时的周数。该值为1(联系人)或0(无联系人)。

购买表格包含用户购买时的周数。

我想计算,考虑到购买周数,是否在过去的n周内(可能是4,8或12)进行了联系,从当前周开始(即,前4周意味着当前周+过去3周)。周数固定,从1到147。

我该怎么做?

数据如下所示:

purchase = data.frame(user_id = c(156086, 156086, 156086, 156086, 156086, 156086, 156086, 156086, 156086, 156086, 156086, 156086, 156086, 156086, 156086, 156086, 156086, 156086, 156086, 156086, 156086, 156086, 156086, 156086, 156086), week_number =  c(1, 5, 9, 13, 16, 21, 30, 38, 42, 46, 50, 53, 72, 76, 83, 93, 98, 103, 110, 120, 124, 128, 133, 137, 141))

contact = data.frame(user_id = c(156086, 156086, 156086, 156086, 156086, 156086, 156086, 156086, 156086, 156086, 156086, 156086, 156086, 156086, 156086, 156086, 156086), week_number = c(99, 120, 101, 105, 119, 117, 118, 119, 117, 118, 119, 116, 115, 118, 119, 116, 118), contacted = c(1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1))

我只是放了一个用户,但是有大约4万用户。该用户的预期结果是(我省略了user_id,因为它与以前相同):

output = data.frame(week_number =  c(1, 5, 9, 13, 16, 21, 30, 38, 42, 46, 50, 53, 72, 76, 83, 93, 98, 103, 110, 120, 124, 128, 133, 137, 141), contacted = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1,  0,  0, 0, 0, 0))

我认为的第一个想法是对用户进行for循环,并且为每个用户创建一个从1到147(周数)的数组,在给出周数的情况下插入联系人时,应用具有滞后的rollum;然后,使用购买中的周数,查看购买表中是否有给定周数的联系人。但这需要一段时间。

有没有办法在一行中计算出来?

谢谢!

1 个答案:

答案 0 :(得分:4)

您可以通过滚动连接 data.table -package来实现。用:

library(data.table)
setDT(purchase)
setDT(contact)
out <- contact[purchase, .(user_id = i.user_id, week_number, contacted),
               on = "week_number", roll = 4, nomatch = NA
               ][is.na(contacted), contacted := 0]

你得到:

> out
    user_id week_number contacted
 1:  156086           1         0
 2:  156086           5         0
 3:  156086           9         0
 4:  156086          13         0
 5:  156086          16         0
 6:  156086          21         0
 7:  156086          30         0
 8:  156086          38         0
 9:  156086          42         0
10:  156086          46         0
11:  156086          50         0
12:  156086          53         0
13:  156086          72         0
14:  156086          76         0
15:  156086          83         0
16:  156086          93         0
17:  156086          98         0
18:  156086         103         1
19:  156086         110         0
20:  156086         120         1
21:  156086         124         1
22:  156086         128         0
23:  156086         133         0
24:  156086         137         0
25:  156086         141         0

解释

使用setDT将数据帧转换为datatbales(数据帧的增强形式)。使用purchase数据框/数据表作为contact数据框/数据表与nomatch = NA组合的参考,.(user_id=i.user_id, week_number, contacted)roll = 4会返回带有匹配项的数据表在过去的4周内联系了客户。