业务环境:
在全国设有多家商店的零售连锁店会在所有商店的不同时间点向其顾客发起优惠券活动,我负责处理优惠券 更好并计算每个优惠券的响应率。
我已经到达如下数据框,
"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
......
有人可以帮我吗?
预先感谢
答案 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