如何在R Dataframe中将每个组的第一个值分配为“ 1”,其余为“ 0”

时间:2018-12-30 01:46:26

标签: r

业务环境:

在全国设有多家商店的零售连锁店会在所有商店的不同时间点向其顾客发起优惠券活动,我负责处理优惠券 更好并计算每个优惠券的响应率。

我已经到达如下数据框,

"customerID Couponid CouponExpiryDate RetailstoreID   Visitdate campaignresponse
AA1          111        01-10-18       B3B12           01-01-18         1     
AA1          111        01-10-18       B3B12           01-02-18         1
AA2          111        01-10-18       B3B51           01-25-18         0
AA3          121        01-25-18       B54D3           01-14-18         1
AA1          111        01-10-18       B3B12           01-11-18         0   
AA4          115        01-15-18       B3B12           01-01-18         1     
AA3          111        01-25-18       B54D3           01-23-18         1
......     

问题:

我使用了一个简单的mutate语句来计算最后一列“ Campaignresponse”

假设OrderDate =“ 12-31-17”

df<-df%>%mutate(campaignresponse = Visitdate >=OrderDate & (Visitdate <=CouponExpiryDate ))%>%replace_na(list((campaignresponse =0))

如果您查看上面的数据帧,尤其是行号:2和行号:7,它显示为“ 1”,但我希望它为“ 0”。因为就我而言,客户只能响应一次优惠券活动 并且如果访问日期早于到期日期,则应为1。但是,有些客户在广告活动期间两次访问了商店或两次以上,我的代码计算得出 他们响应广告系列,并为其分配了值“ 1”,但这是错误的。

理想情况下,我想要以下内容,

customerID Couponid CouponExpiryDate RetailstoreID   Visitdate campaignresponse
AA1          111        01-10-18       B3B12           01-01-18         1     
AA1          111        01-10-18       B3B12           01-02-18         0
AA2          111        01-10-18       B3B51           01-25-18         0
AA3          121        01-25-18       B54D3           01-14-18         1
AA1          111        01-10-18       B3B12           01-11-18         0   
AA4          115        01-15-18       B3B12           01-01-18         1     
AA3          121        01-25-18       B54D3           01-23-18         0
...... 

有人可以帮我吗?

预先感谢

1 个答案:

答案 0 :(得分:1)

df<-df %>% group_by(customerID, Couponid) %>% 
 dplyr::mutate(campaignresponse = as.integer(Visitdate >=OrderDate & (Visitdate <=CouponExpiryDate ) & row_number()==1))

您要添加一个条件,即该行是具有相同客户ID和优惠券ID的所有行中的第一行(这假设数据已经按日期排序-如果不是,则添加一个describe()行)。

结果:

# A tibble: 7 x 6
# Groups:   customerID, Couponid [5]
  customerID Couponid CouponExpiryDate RetailstoreID Visitdate  campaignresponse
  <fct>         <int> <date>           <fct>         <date>                <int>
1 AA1             111 2018-01-10       B3B12         2018-01-01                1
2 AA1             111 2018-01-10       B3B12         2018-01-02                0
3 AA2             111 2018-01-10       B3B51         2018-01-25                0
4 AA3             121 2018-01-25       B54D3         2018-01-14                1
5 AA1             111 2018-01-10       B3B12         2018-01-11                0
6 AA4             115 2018-01-15       B3B12         2018-01-01                1
7 AA3             111 2018-01-25       B54D3         2018-01-23                1