R中按ASHRAE分组操作两个data.table并合并结果的实现方法
R data.table 按ASHRAE分组匹配计算方案
直接利用data.table的分组非等连接能力实现,无需手动拆分、遍历子集再合并结果,计算效率远高于逐组循环逻辑。
前置准备
- 确认
sw和Sub_Index均已转为data.table对象 - 确认
Sub_Index中存储年积日(1-365)的字段名,下文代码默认该字段名为DayOfYear,如果实际命名不同直接替换连接条件中对应字段即可 - 加载依赖包:
library(data.table)
核心实现代码
# 设置关联键,加速分组匹配 setkeyv(sw, c("ASHRAE", "ID")) setkeyv(Sub_Index, c("ASHRAE", "ID")) # 按规则逐批计算RemRatio result <- copy(sw)[, RemRatio := 0][ # 规则3:全年运行记录直接赋值0.999 Functional_days == 365, RemRatio := 0.999 ][ # 规则1:非跨年区间,匹配同ASHRAE+ID下区间内FailRatio求和 Functional_days != 365 & StartDayOFYear < EndDayOFYear, RemRatio := fcoalesce( Sub_Index[.SD, on = .(ASHRAE, ID, DayOfYear >= StartDayOFYear, DayOfYear <= EndDayOFYear), sum(FailRatio, na.rm = TRUE), by = .EACHI]$V1, 0 ) ][ # 规则2:跨年区间,分年末、年初两段求和后累加 Functional_days != 365 & StartDayOFYear > EndDayOFYear, RemRatio := fcoalesce( Sub_Index[.SD, on = .(ASHRAE, ID, DayOfYear >= StartDayOFYear, DayOfYear <= 365), sum(FailRatio, na.rm = TRUE), by = .EACHI]$V1 + Sub_Index[.SD, on = .(ASHRAE, ID, DayOfYear >= 1, DayOfYear <= EndDayOFYear), sum(FailRatio, na.rm = TRUE), by = .EACHI]$V1, 0 ) ][ # 规则4:所有剩余空值统一赋值为0 is.na(RemRatio), RemRatio := 0 ]
逻辑说明
- 代码全程在data.table内部按
ASHRAE+ID分组自动完成子集匹配、计算,不需要手动拆分每个ASHRAE对应的子集,也不需要单独写rbind逻辑拼接结果,运行完成直接返回整合好的全量结果表 by=.EACHI参数会自动在每一组匹配的ASHRAE、ID、区间范围内执行求和计算,完全等价于手动拆分每个ASHRAE子集后单独计算的逻辑,但运行效率有量级提升- 求和逻辑内置空值处理,即使区间内存在FailRatio空值、或者匹配不到Sub_Index的对应记录,也不会出现异常NA值,最终空值补0的逻辑覆盖所有边界场景
- 代码用
copy(sw)生成结果对象,不会修改原始输入的sw表,避免原始数据被意外覆盖
内容的提问来源于stack exchange,提问作者Arvind Menon
相关产品推荐
相关产品推荐

