如何在SAS中批量判断多组前缀命名变量是否缺失并删除观测
SAS批量删除多前缀变量全缺失的观测
报错原因
你用missing(R1_:)的写法是错误的——SAS的missing()函数不支持变量名前缀通配符(:),它只能接收单个变量作为参数,所以SAS无法解析R1_:这类批量变量写法,直接抛出语法错误。
可行解决方案
因为你的变量包含字符和数值型,且数量超过500个,必须用批量变量处理逻辑,以下两种方法都可以实现需求:
方法1:用cmiss()+前缀变量列表(最简洁)
cmiss()可以同时判断字符型和数值型的缺失值,配合前缀通配符:批量指定变量,直接对比缺失数和变量总数:
Data dataset; set dataset2; /* 当R1_、R2_、R3_开头的所有变量各自都全缺失时,删除该观测 */ if cmiss(of R1_:) = dim(of R1_:) and cmiss(of R2_:) = dim(of R2_:) and cmiss(of R3_:) = dim(of R3_:) then delete; run;
cmiss(of R1_:):统计所有R1_前缀变量的缺失值数量dim(of R1_:):获取R1_前缀变量的总个数- 当两者相等时,说明该组变量全缺失
方法2:数组循环检查(更高效,适合大数据集)
如果数据集很大,数组循环可以在找到第一个非缺失值时立即终止循环,节省计算资源:
Data dataset; set dataset2; /* 定义三个数组,分别对应三个前缀的变量 */ array r1[*] R1_:; array r2[*] R2_:; array r3[*] R3_:; /* 初始化标记:默认认为全缺失 */ r1_miss = 1; r2_miss = 1; r3_miss = 1; /* 检查R1组:找到非缺失值就标记为不全缺失并跳出循环 */ do i = 1 to dim(r1); if not missing(r1[i]) then do; r1_miss = 0; leave; end; end; /* 检查R2组 */ do i = 1 to dim(r2); if not missing(r2[i]) then do; r2_miss = 0; leave; end; end; /* 检查R3组 */ do i = 1 to dim(r3); if not missing(r3[i]) then do; r3_miss = 0; leave; end; end; /* 三组都全缺失则删除 */ if r1_miss and r2_miss and r3_miss then delete; /* 删除临时变量 */ drop i r1_miss r2_miss r3_miss; run;
额外提示
- 如果所有变量都是数值型,把
cmiss()换成nmiss(),速度更快 - 前缀通配符
:会匹配所有以指定字符串开头的变量,不管它们在数据集中的位置是否连续
内容的提问来源于stack exchange,提问作者Magnus
相关产品推荐
相关产品推荐

