我有两个数据集,购买和联系人。它们只共享用户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;然后,使用购买中的周数,查看购买表中是否有给定周数的联系人。但这需要一段时间。
有没有办法在一行中计算出来?
谢谢!
答案 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周内联系了客户。