如何基于同组其他行日期条件计算当前行的累加和(cumsum)
解决同组内基于日期条件的Amount累加问题
看起来你需要按Group分组后,为每一行计算同组中所有BookDate早于当前行SubmitDate的Amount总和。你之前尝试的代码只比较了当前行自身的SubmitDate和BookDate,这和需求不符,我来帮你修正这个逻辑。
首先,先确认示例数据的生成代码(你提供的是正确的,这里再清晰呈现):
data <- data.frame( ID = c(1,2,3,4,5,6), Group = c("A","A","B","B","B","B"), SubmitDate = as.Date(c("2011-01-01","2011-10-01","2012-01-01","2012-02-01","2012-03-01","2012-03-16")), BookDate = as.Date(c("2011-01-01","2011-05-01","2012-02-20","2012-04-01","2012-03-15","2012-03-18")), Amount = as.numeric(c("100","0","500","300","400","900")) )
两种可行的解决方案
方案1:用purrr::map_dbl实现批量逐行计算
我们可以在分组后,对每个SubmitDate,筛选同组内所有满足BookDate < 当前SubmitDate的Amount并求和:
library(dplyr) library(purrr) result <- data %>% group_by(Group) %>% mutate( Total = map_dbl(SubmitDate, ~ sum(Amount[BookDate < .x])) ) %>% ungroup() print(result)
方案2:用rowwise()逐行处理
如果你更偏好直观的逐行处理方式,rowwise()也是一个不错的选择:
library(dplyr) result <- data %>% group_by(Group) %>% rowwise() %>% mutate( Total = sum(Amount[BookDate < SubmitDate]) ) %>% ungroup() print(result)
结果验证
运行任意一种方案后,得到的Total字段都会和你示例中的预期完全一致:
- ID5的
SubmitDate(2012-03-01)仅晚于同组ID3的BookDate(2012-02-20),因此Total=500 - ID6的
SubmitDate(2012-03-16)晚于同组ID3和ID5的BookDate,因此Total=500+400=900
这两种方案的核心逻辑都是在分组范围内,针对每一行的SubmitDate,匹配所有符合日期条件的历史行并累加对应Amount,修正了你之前代码中仅比较当前行自身两个日期的逻辑错误。
内容的提问来源于stack exchange,提问作者Famrin
相关产品推荐
相关产品推荐

