业务环境:
一家在全国拥有多家门店的零售连锁店在所有门店的不同时间点推出了优惠券活动,我和客户正在研究哪种优惠券表现更好,并计算每种优惠券的响应率。
我已经达到了下面这样的数据框架,
"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
...... 问题:
我使用了一个简单的变异语句来计算最后一列"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
...... 有没有人能帮我一下?
提前感谢
发布于 2018-12-30 10:05:48
df<-df %>% group_by(customerID, Couponid) %>%
dplyr::mutate(campaignresponse = as.integer(Visitdate >=OrderDate & (Visitdate <=CouponExpiryDate ) & row_number()==1))您希望添加一个条件,即该行是具有相同客户id和优惠券id的所有行中的第一行(假设数据已经按日期排序-如果不是,则添加一个arrange()行)。
结果:
# 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 1https://stackoverflow.com/questions/53974708
复制相似问题