时间:2017-05-08 15:53:36

标签: r database dplyr

在完成数据工作时,我遇到了这个问题。
我有客户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
    ....

1 个答案:

答案 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