在完成数据工作时,我遇到了这个问题。
我有客户ID,receipt_id和product_id。 product_id表示给定客户在给定收据处购买的产品。
数据按客户ID和receipt_id排序。 receipt_id的较低值表示较早的购物行程。
对于每个产品,我想创建一个虚拟变量,指示是否在过去的购物旅行中购买了每个产品(在之前的收据ID中)。
我有前三列,想要创建第4列,“purchase_before”。
我可以通过使用for循环来实现它,但有没有有效的方法?
数据如下,
customer id receipt_id product_id purchased_before
1 1 113 0
1 1 114 0
1 2 113 1
1 2 116 0
1 2 346 0
1 3 421 0
1 3 114 1
1 3 421 0
....
2 1 213 0
2 1 114 0
2 2 113 0
2 2 116 0
2 2 346 0
2 3 113 1
2 3 114 1
2 3 421 0
....
答案 0 :(得分:1)
以下是dplyr
的使用方法。请注意,此解决方案选择之前已按客户ID 1购买的product_id 421。您的问题未显示该问题。
df <-read.table(text="customer_id receipt_id product_id purchased_before
1 1 113 0
1 1 114 0
1 2 113 1
1 2 116 0
1 2 346 0
1 3 421 0
1 3 114 1
1 3 421 0
2 1 213 0
2 1 114 0
2 2 113 0
2 2 116 0
2 2 346 0
2 3 113 1
2 3 114 1
2 3 421 0",header=TRUE, stringsAsFactors=FALSE)
library(dplyr)
df %>%
group_by(customer_id,product_id) %>%
mutate(purchased_before2=duplicated(product_id)*1)
customer_id receipt_id product_id purchased_before purchased_before2
<int> <int> <int> <int> <dbl>
1 1 1 113 0 0
2 1 1 114 0 0
3 1 2 113 1 1
4 1 2 116 0 0
5 1 2 346 0 0
6 1 3 421 0 0
7 1 3 114 1 1
8 1 3 421 0 1
9 2 1 213 0 0
10 2 1 114 0 0
11 2 2 113 0 0
12 2 2 116 0 0
13 2 2 346 0 0
14 2 3 113 1 1
15 2 3 114 1 1
16 2 3 421 0 0