首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在R Dataframe中将每个组的第一个值指定为"1“,并将其余值指定为”0

如何在R Dataframe中将每个组的第一个值指定为"1“,并将其余值指定为”0
EN

Stack Overflow用户
提问于 2018-12-30 09:46:26
回答 1查看 116关注 0票数 0

业务环境:

一家在全国拥有多家门店的零售连锁店在所有门店的不同时间点推出了优惠券活动,我和客户正在研究哪种优惠券表现更好,并计算每种优惠券的响应率。

我已经达到了下面这样的数据框架,

代码语言:javascript
复制
"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“

代码语言:javascript
复制
df<-df%>%mutate(campaignresponse = Visitdate >=OrderDate & (Visitdate <=CouponExpiryDate ))%>%replace_na(list((campaignresponse =0))

如果你看上面的数据框,特别是第2行和第7行,它显示"1“,但我希望它是"0”。因为在我的例子中,一个客户只能响应一次优惠券活动,如果访问日期在到期日期之前,它应该是1。但是有些客户在活动期间访问过商店两次或更多,我的代码计算出他们将响应活动,并分配一个值"1“,但这是错误的。

理想情况下,我想要像下面这样的东西,

代码语言:javascript
复制
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
...... 

有没有人能帮我一下?

提前感谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-30 10:05:48

代码语言:javascript
复制
df<-df %>% group_by(customerID, Couponid) %>% 
 dplyr::mutate(campaignresponse = as.integer(Visitdate >=OrderDate & (Visitdate <=CouponExpiryDate ) & row_number()==1))

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

结果:

代码语言:javascript
复制
# 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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53974708

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档