SAS如何基于多组配对列比较结果生成差异计数新列
问题原因排查
你的原有代码运行后结果不对,主要是三个错误:
- 差异计数变量
differences的初始化放在了循环内部,每一轮循环都会把计数重置为0,无法累计差异数 - 定义的数组没有实际参与逻辑,循环完全是冗余操作,你写的两个if判断会被重复执行多次,没有意义
- 数组名和已有的
id列重名,会导致变量冲突,不符合SAS语法规范
正确实现方案
方案1:配对列数量少的直接写法
如果只有少量配对列,不需要循环,直接写判断即可:
data result; set temp; differences = 0; if int1 ^= int2 then differences + 1; if char1 ^= char2 then differences + 1; run;
你给出的示例数据跑这段代码可以直接得到你预期的结果。
方案2:多配对列的循环写法(适配你36列的实际场景)
当配对列数量多的时候,用两个数组分别存储每组配对的第一个列和第二个列,循环遍历判断即可,不需要手动写几十条if语句:
data result; set temp; * 第一个数组存所有配对的首列,顺序和第二个数组一一对应; array group1[*] int1 char1 /* 剩下的16组配对的首列按顺序加在这里即可 */; * 第二个数组存所有配对的次列,和group1的顺序严格对应; array group2[*] int2 char2 /* 剩下的16组配对的次列按顺序加在这里即可 */; differences = 0; do i = 1 to dim(group1); if group1[i] ^= group2[i] then differences + 1; end; * 删掉不需要输出的循环变量i; drop i; run;
逻辑说明:
- 两个数组的元素数量必须相等,顺序一一对应,比如group1第1位是int1,group2第1位就必须是int2
dim()函数会自动读取数组的元素总数,后续新增配对列不需要修改循环的终止条件- 计数初始化放在循环外部,每条观测只初始化一次,判断到一组不等就累计加1
注意:SAS数组要求同类型变量放在同一个数组里,如果你的配对列既有数值型又有字符型,可以分开定义数值组的两个数组、字符组的两个数组,分别循环判断即可,计数变量共用一个就可以。
内容的提问来源于stack exchange,提问作者DD chen
相关产品推荐
相关产品推荐

