如何用SAS生成标识变量ind,判断变量是否仅为1或2
解决SAS中创建条件判断变量
ind的问题 原始数据集
| id | var1 | var2 | var3 | var4 |
|---|---|---|---|---|
| 1 | 1 | 2 | 1 | 1 |
| 2 | 1 | 1 | 1 | 1 |
| 3 | 1 | 2 | 3 | 1 |
需求
生成新变量ind:
- 当
var1至var4所有值均为1或2时,ind=1 - 只要有任意变量值不是1或2,
ind=0
预期结果
| id | var1 | var2 | var3 | var4 | ind |
|---|---|---|---|---|---|
| 1 | 1 | 2 | 1 | 1 | 1 |
| 2 | 1 | 1 | 1 | 1 | 1 |
| 3 | 1 | 2 | 3 | 1 | 0 |
原代码问题
原代码存在两处核心错误:
- 判断条件仅检查变量等于1,未覆盖等于2的情况
- 临时数组定义了30个元素,远超实际需要的4个,且最终
sum(of bin_column[*])>0的逻辑完全不符合需求(需求是所有变量都符合,而非存在符合的)
修正方案
方案一:循环检查(高效简洁)
data want; set have; array alpha[*] var1--var4; ind = 1; /* 默认所有变量符合条件 */ do i = 1 to dim(alpha); if alpha[i] not in (1, 2) then do; ind = 0; leave; /* 发现不符合项直接终止循环,节省资源 */ end; end; drop i; run;
方案二:利用sum函数直接统计符合条件的变量数
data want; set have; array alpha[*] var1--var4; /* 统计符合1/2的变量数量,等于总变量数则ind=1 */ ind = (sum(of alpha[*] in (1,2)) = dim(alpha)); run;
方案说明
- 方案一通过提前初始化
ind=1,遍历过程中只要发现不符合项就修改ind并退出循环,逻辑直观且效率高 - 方案二利用SAS的数组条件求和特性,一行代码完成判断,适合追求简洁写法的场景
内容的提问来源于stack exchange,提问作者xshbj
相关产品推荐
相关产品推荐

