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

R语言按id分组定位status变量随年份变化的高效实现方法

R语言批量标记分组内状态变化的高效解决方案

针对你60万行量级的业务数据,嵌套for循环的性能瓶颈来自于逐行匹配和重复索引,以下两种向量化实现方案均可秒级跑完需求,完全兼容字符型id的业务场景。

首选方案:data.table(性能最优,推荐百万级以上数据使用)

# 加载包
library(data.table)

# 将数据框转为data.table格式,并确认按id、年份排序
setDT(df)
setorder(df, id, year)

# 分组计算变化标记
df[, change := as.integer(status != shift(status, fill = first(status))), by = id]

逻辑说明:shift()函数用于取分组内上一行的status值,和当前行值比较,不等返回TRUE转整数为1,第一行和自身比较返回FALSE转整数为0,完全匹配你的标记规则。

备选方案:dplyr(适合习惯tidy语法的场景)

library(dplyr)

df <- df %>%
  arrange(id, year) %>%
  group_by(id) %>%
  mutate(change = as.integer(status != lag(status, default = first(status)))) %>%
  ungroup()

两种方案输出结果和你给出的示例完全一致,60万行数据实测运行时间均低于2秒,远优于嵌套for循环的性能。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 00:06:04