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

R中使用data.table将Type=B记录聚合到后续Type=A记录的实现方法

实现思路
  • 第一步:将原始数据转换为data.table格式,按Id字段升序排序,保证记录顺序符合要求
  • 第二步:从后往前遍历数据生成分组标记:每遇到一条Type="A"的记录就新增一个分组,这样所有连续的Type="B"记录会和紧邻的下一条Type="A"记录划分到同一个分组
  • 第三步:按生成的分组聚合计算:
    • 保留分组内最大的Id(即对应Type="A"的记录Id)
    • 对Qty和Difference字段求和
    • 新增AdjustedFlag字段:分组内如果包含Type="B"的记录标记为1,否则标记为0
data.table实现代码
library(data.table)

# 原始数据
df_initial <- data.frame("Id" = c(1, 2, 3, 4, 5), 
                         "Qty" = c(105, 110, 100, 115, 120), 
                         "Type" = c("A", "B", "B", "A", "A"), 
                         "Difference" = c(30, 34, 32, 30, 34))

# 转换为data.table并按Id排序
dt <- as.data.table(df_initial)
setorder(dt, Id)

# 生成分组标记 + 聚合计算,最后删除临时分组列
dt_new <- dt[, .(
  Id = max(Id),
  Qty = sum(Qty),
  Type = "A",
  Difference = sum(Difference),
  AdjustedFlag = as.integer(any(Type == "B"))
), by = .(group = rev(cumsum(rev(Type == "A"))))][, !"group"]

运行后得到的dt_new和预期结果完全一致:

Id Qty Type Difference AdjustedFlag
1:  1 105    A         30            0
2:  4 325    A         96            1
3:  5 120    A         34            0

内容的提问来源于stack exchange,提问作者user12351378

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 11:18:00