SAS基于已有变量观测值创建新变量时逻辑错误如何解决
问题根源
你的判断条件不符合预期,是因为SAS的逻辑运算符存在优先级差异:AND的运算优先级高于OR,未加括号分组的情况下,运算顺序和你预想的逻辑不一致。
你当前编写的条件实际执行逻辑为:
var2到var17任意一个变量取值为"VALID",或 var18取值为"VALID"同时var1取值为空格时,new_column赋值为"yes"
这就导致只要var2-var17中存在"VALID",无论var1是什么取值(包括var1为"VALID"的情况),都会被错误标注为"yes"。
修正方法
方法1:给条件加括号明确运算顺序
给var2到var18的整体判断加上括号,明确要求这部分整体满足后,再判断var1为空格的条件:
data mydata_1; set mydata; if (var2 = "VALID" or var3 = "VALID" or var4 = "VALID" or var5 = "VALID" or var6 = "VALID" or var7 = "VALID" or var8 = "VALID" or var9 = "VALID" or var10 = "VALID" or var11 = "VALID" or var12 = "VALID" or var13 = "VALID" or var14 = "VALID" or var15 = "VALID" or var16 = "VALID" or var17 = "VALID" or var18 = "VALID") and var1 = " " then new_column = "yes"; run;
方法2:用WHICHC函数简化代码
逐个写OR判断冗余且容易出错,可以用SAS自带的WHICHC函数直接判断var2到var18范围内是否存在"VALID",代码更简洁:
data mydata_1; set mydata; /* whichc返回目标值在变量列表中第一次出现的位置,大于0即代表存在 */ if var1 = " " and whichc("VALID", of var2-var18) > 0 then new_column = "yes"; run;
内容的提问来源于stack exchange,提问作者miczan
相关产品推荐
相关产品推荐

