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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 05:18:53