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

