如何在SAS中按缺失值连续分组生成序号列并保持原有排序?
SAS数据集新增连续分组标记列seq的实现方法
需求说明:现有按name和visit排序的SAS数据集,需新增一列seq,标记规则为:
- 第一组连续非缺失
aval值标记为1 - 第一组连续缺失
aval值标记为2 - 第二组连续非缺失
aval值标记为3 - 以此类推,每组连续相同缺失状态的行使用同一个seq值,状态切换时seq递增
原数据集代码
data test; input name $ visit $ aval; cards; A101 w1 10 A101 w2 15 A101 w3 18 A101 w4 . A101 w5 45 A101 w6 50 A101 w7 . A101 w8 89 A101 w9 20 A101 w10 19 ; run;
实现代码
data test1; set test; retain prev_missing seq; curr_missing = missing(aval); if _N_ = 1 then do; seq = 1; prev_missing = curr_missing; end; else do; if curr_missing ne prev_missing then do; seq + 1; prev_missing = curr_missing; end; end; drop prev_missing curr_missing; run;
代码逻辑说明
- 使用
retain语句保留上一行的缺失状态(prev_missing)和当前seq值,避免每次循环重置变量 - 用
missing(aval)函数判断当前行aval是否缺失,生成curr_missing标记(1=缺失,0=非缺失) - 第一行初始化
seq为1,并记录当前缺失状态 - 后续行若当前缺失状态与上一行不同,则
seq加1,同时更新prev_missing为当前状态 - 最后删除中间变量
prev_missing和curr_missing,只保留所需列
期望输出数据集
data test1; input name $ visit $ aval seq; cards; A101 w1 10 1 A101 w2 15 1 A101 w3 18 1 A101 w4 . 2 A101 w5 45 3 A101 w6 50 3 A101 w7 . 4 A101 w8 89 5 A101 w9 20 5 A101 w10 19 5 ; run;
内容的提问来源于stack exchange,提问作者Akhila Varghese
相关产品推荐
相关产品推荐

