如何在SAS中获取指定行的首个及最后一个缺失值对应位置
SAS实现行内首个/最后一个缺失值对应变量识别方案
实现逻辑
- 定义数组统一管理需要检查的所有变量,支持数值、字符混合类型
- 正序遍历数组,找到第一个缺失值的位置后终止正序遍历
- 倒序遍历数组,找到最后一个缺失值的位置后终止倒序遍历
- 使用
vname()函数将数组下标转换为对应的变量名
完整代码
/* 1. 创建示例数据集 */ data example; length id $1 var1-var12 $1; /* 统一为字符型兼容J行的A/E取值 */ input id var1 var2 var3 var4 var5 var6 var7 var8 var9 var10 var11 var12; cards; A 1 2 3 . . . . . 1 1 1 3 B 3 3 2 1 3 2 1 . . . . . C . . . . 1 2 3 1 2 3 2 . D 3 . 1 . 3 . 1 . 3 . 1 . F 1 3 . . 1 3 . . 1 3 . . E 3 2 1 . . . . . 1 1 1 3 G 3 3 2 1 3 2 1 . . . . . H . . . . . 1 2 3 1 2 3 2 I 3 . 1 . 3 . 1 . 3 . 1 . J A E . . A E . . A E . . ; run; /* 2. 识别每行首个、最后一个缺失值对应的变量 */ data result; set example; /* 定义数组包含所有需要检查的变量 */ array arr[*] var1-var12; length first_miss_var last_miss_var $32; /* 存储变量名 */ first_miss_idx = .; last_miss_idx = .; /* 正序找第一个缺失值 */ do i = 1 to dim(arr); if cmiss(arr[i]) then do; first_miss_idx = i; first_miss_var = vname(arr[i]); leave; /* 找到就退出循环,节省资源 */ end; end; /* 倒序找最后一个缺失值 */ do i = dim(arr) to 1 by -1; if cmiss(arr[i]) then do; last_miss_idx = i; last_miss_var = vname(arr[i]); leave; end; end; /* 可选:删除中间计算变量,只保留需要的结果 */ drop i first_miss_idx last_miss_idx; run; /* 查看结果 */ proc print data=result noobs; run;
代码说明
cmiss()函数可以同时判断数值型、字符型变量的缺失,不需要区分变量类型,兼容性更强dim(arr)可以自动获取数组的长度,不需要手动写变量总数,修改变量列表时不需要改循环参数- 找到目标值后直接用
leave退出循环,不需要遍历所有变量,运行效率更高 - 输出结果中
first_miss_var就是首个缺失值对应的变量名,last_miss_var是最后一个缺失值对应的变量名,和示例结果完全匹配:id为A的行输出first_miss_var=var4、last_miss_var=var8,id为D的行输出first_miss_var=var2、last_miss_var=var12
注意事项
- 如果某行没有任何缺失值,
first_miss_var和last_miss_var都会返回空值,可根据业务需求额外加判断逻辑处理这类场景 - 如果需要检查的变量不是连续命名的,只需要修改数组定义的部分,比如
array arr[*] var1 var3 var5 age height;把需要检查的变量列进去即可
内容的提问来源于stack exchange,提问作者Rui Gouveia
相关产品推荐
相关产品推荐

