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
相关产品推荐
相关产品推荐

