基于可变日期在R中统计响应值的技术实现问题
嘿,我懂你的需求了——你需要按CustomerID和AccountID分组,对每个OpenDate统计该日期及之前所有Response=1的累计数量(从你的样本和期望结果能看出来是累计1的个数)。之前用summarise没达到预期,是因为summarise是做分组聚合(每个组只返回一行),而你要的是每个组内每一行都对应一个累计值,这时候得用mutate配合cumsum来实现。
具体步骤和代码
假设你的数据框名叫df,直接用这段代码就能得到你要的结果:
library(dplyr) df_result <- df %>% # 按客户和账户分组,保证每组独立计算 group_by(CustomerID, AccountID) %>% # 先按日期排序,确保累计顺序正确(如果数据已经按日期排好可以省略,但加上更稳妥) arrange(OpenDate) %>% # 用cumsum计算累计的Response=1的数量——因为Response只有0和1,累加正好是累计计数 mutate(Count = cumsum(Response)) %>% # 可选:取消分组,方便后续操作 ungroup()
验证结果
把你的样本数据代入后,输出结果和你期望的完全一致:
CustomerID AccountID OpenDate Response Count
AAA 456 2020-01-01 1 1
AAA 456 2020-01-03 1 2
AAA 456 2020-01-05 1 3
BBB 789 2020-02-01 1 1
BBB 789 2020-02-22 0 1
BBB 789 2020-03-01 1 2
为啥之前用summarise不行?
简单说,summarise是把每个组的数据聚合为一行结果,而你需要的是保留每个组内的所有行,同时给每行加上到当前日期的累计值——这种逐行的转换操作,mutate才是正确的选择,cumsum则专门用来做累计求和,完美匹配你的需求。
内容的提问来源于stack exchange,提问作者easymoneysniper

