You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于同组其他行日期条件计算当前行的累加和(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:58:49