如何在SAS数据集中横向排查并标记PB/MB后的非缺失值
SAS数据集记录标记问题
问题背景
现有SAS数据集Have:
data Have; input col1 $ col2 $ col3 $ col4 $ col5 $ col6 $ col7 $ col8 $ col9 $ col10 $; cards; PM MM JM MM PM PB . . PM . PM MM JM MM PM PB JM . . . PM MM JM MM PM MB PM MM . . PM MM JM MM PM PM MB . . PM MM JM MM PM PM PB . . ;
需求:横向排查每条记录,若PB或MB之后存在任意非缺失值,则标记该记录的flag为1,否则为0。预期输出如下:
flag PM MM JM MM PM PB . . PM . 1 PM MM JM MM PM PB JM . . . 1 PM MM JM MM PM MB PM MM . . 1 PM MM JM MM PM PM MB . . 0 PM MM JM MM PM PM PB . . 0
解决方案
以下SAS代码可实现需求:
data Want; set Have; flag = 0; array cols[*] col1-col10; do i = 1 to dim(cols); if cols[i] in ('PB', 'MB') then do; do j = i+1 to dim(cols); if not missing(cols[j]) then do; flag = 1; leave; end; end; leave; end; end; drop i j; run;
逻辑说明
- 通过数组
cols将所有待检查变量整合,简化循环操作。 - 外层循环遍历变量,定位第一个出现
PB或MB的位置。 - 内层循环从该位置的下一个变量开始检查,一旦发现非缺失值,立即将
flag设为1并终止所有循环,减少不必要的计算。 - 最后删除临时变量
i和j,保持数据集整洁。
内容的提问来源于stack exchange,提问作者Sai Paritala
相关产品推荐
相关产品推荐

