SAS技术问题:如何标记列序列中PB/MB后含其他值的记录
SAS数据集标记解决方案
现有数据集
data have; length col1-col10 $2.; input col1-col10; datalines; PM MM JM MM PM MM MM PB . . MM JM PM MB . . . . . . MM MM PM JM PB MM . . . . PM PM PM MM MB MM JM . . . ; run;
需求说明
标记所有在列序列中出现PB或MB之后,仍存在非PB、非MB且非缺失值的记录。
期望输出
Flag PM MM JM MM PM MM MM PB . . 0 MM JM PM MB . . . . . . 0 MM MM PM JM PB MM . . . . 1 PM PM PM MM MB MM JM . . . 1
解决方案代码
data want; set have; array cols[*] col1-col10; flag = 0; /* 定位第一个PB/MB的出现位置 */ do i = 1 to dim(cols); if cols[i] in ('PB', 'MB') then do; /* 检查该位置之后的所有列 */ do j = i+1 to dim(cols); if cols[j] not in ('PB', 'MB', '.') then do; flag = 1; leave; /* 找到符合条件的值后直接终止循环 */ end; end; leave; /* 找到第一个PB/MB后停止向前遍历 */ end; end; drop i j; run; /* 打印验证结果 */ proc print data=want noobs; run;
逻辑说明
- 用数组
cols批量处理所有列,简化遍历操作; - 先找到第一条
PB或MB的位置,避免重复检查; - 从该位置的下一列开始校验,只要发现符合条件的非目标值,立即标记
flag=1并退出循环,提升效率; - 若
PB/MB之后没有有效非目标值,flag保持初始值0。
内容的提问来源于stack exchange,提问作者Sai Paritala
相关产品推荐
相关产品推荐

