gpt4 book ai didi

r - 使用 rollsum 并组合两个数据框

转载 作者:行者123 更新时间:2023-12-01 00:46:16 31 4
gpt4 key购买 nike

我有两个数据集,购买和联系人。他们只共享用户的 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))

我只放了一个用户,但有大约 40k 用户。该用户的预期结果是(我省略了 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(周数)的数组,在给定周数进行联系时插入,应用带有滞后的 rollsum;然后,使用采购中的周数,查看采购表中是否存在给定周数的联系人。但这需要一段时间。

有没有办法在一行中计算这个?

谢谢!

最佳答案

您可以通过 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您将数据帧转换为数据包(这是数据帧的增强形式)。使用 purchase数据帧/数据表作为 contact 的引用数据框/数据表结合 nomatch = NA , .(user_id=i.user_id, week_number, contacted)roll = 4在过去 4 周内联系过客户时,返回包含匹配项的数据表。

关于r - 使用 rollsum 并组合两个数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34240711/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com