You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 16:15:02