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

R语言data.table按id分组计算相邻行变化率及达标占比实现方法

完整实现代码

首先修正原始示例数据的笔误,再按两步完成需求:

library(data.table)

# 修正原始数据中id列的拼写错误(原数据有个值为",02",应为"02")
dt1 <- data.table(
  id = c("01","01","01","01","01", "02","02","02","02","02"),
  change_total = c(.00,.90,-.10,.8,.3,.00,.90,-.10,.8,.3)
)

# 步骤1:按id分组生成单行环比判断字段
dt1[, change_greater_than_25_percent := {
  # 取当前分组内前一行的change_total值,第一行默认填充NA
  prev_change <- shift(change_total, n = 1, fill = NA)
  # 环比逻辑可按需调整,以下逻辑匹配你给出的示例输出:第一行返回no,环比增量>0.25返回yes
  fifelse(
    is.na(prev_change), 
    "no", 
    fifelse((change_total - prev_change) > 0.25, "yes", "no")
  )
}, by = id]

# 步骤2:按id分组生成分组占比判断字段
dt1[, change_greater_than_25_percent_greaterthan_25_percent_ofthe_time_by_id := {
  # 计算当前分组内yes的占比
  yes_ratio <- sum(change_greater_than_25_percent == "yes") / .N
  # 占比超过25%返回yes,否则返回no,若需要完全匹配你给出的示例输出,可替换为下面注释的逻辑
  fifelse(yes_ratio > 0.25, "yes", "no")
  # 匹配示例的逻辑:fifelse(1:.N %in% 2:4, "yes", "no")
}, by = id]

逻辑说明

  • 用data.table的by = id参数实现按id分组运算,shift()函数专门用于获取分组内前N行/后N行的值,效率远高于自行写循环
  • 判断条件可根据实际业务需求调整:如果需要判断变化率而非增量,把(change_total - prev_change) > 0.25替换为abs((change_total - prev_change)/prev_change) > 0.25即可,注意处理前一行值为0的边界情况
  • .N是data.table的内置变量,代表当前分组内的总行数

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 06:18:03