努力获得此If / Then / Else语句不起作用。我有两列:变量和值。变量具有变量的名称,而Value具有可与该变量关联的所有潜在代码。
示例:
Variable Value
Gender F
Gender M
我想创建一个名为“Flag”的字段,如果该值不在值列表中,则应标记该字段;否则,将该字段留空
data Want;
length
Variable $40.
Value $40.
Flag $8.;
set Have (keep = Variable Value);
if (Variable = 'Gender' and Value ^= 'M') then Flag = 'UnkCode'; else Flag="";
if (Variable = 'Gender' and Value ^= 'F') then Flag = 'UnkCode'; else Flag="";
if (Variable = 'Gender' and Value ^= 'O') then Flag = 'UnkCode'; else Flag="";
if (Variable = 'Gender' and Value ^= 'U') then Flag = 'UnkCode'; else Flag="";
run;
quit;
我正在使用的数据集只有两个为Gender的值:F和M.无论出于何种原因,两行中的flag字段都有“UnkCode”
知道我做错了什么吗?
答案 0 :(得分:4)
可能更清楚一点:if语句按顺序进行评估。
因此,对于您的第一次观察,Flag最初将设置为"",(' M' =' M')。但是,Flag会被后续的if语句覆盖,而且(' M' ^ =' F'),Flag会被覆盖,并取值' UnkCode&#39 ;
除了Keni使用in语句(这比我将建议的代码更好)之外,您还可以执行以下操作(这可以帮助您更好地理解if语句)。
if (Variable = 'Gender' and Value = 'M') then Flag = "";
else if (Variable = 'Gender' and Value = 'F') then Flag = "";
else if (variable = 'Gender' and Value = 'O') then Flag = "";
else if (Variable = 'Gender' and Value = 'U') then Flag = "";
else if (Variable = 'Gender') then Flag = 'UnkCode';
我可能还建议,不要使用名为'变量'的变量,而值为'性别',您只需要一个名为' Gender'的变量。价值为' F'或者' M'。虽然在某些特定情况下您不希望以这种方式创建数据集,但它们相对较少且相差甚远。
答案 1 :(得分:3)
我将所有IF条件放在一个语句中并且有效。
data Want;
length Variable $40. Value $40. Flag $8.;
set Have (keep = Variable Value);
If (Variable = 'Gender' and Value in ('F','M','O','U')) then Flag =" ";
else Flag = 'UnkCode';
run;
quit;
要为多个变量标记...这应该有用。
data Want;
length Variable $40. Value $40. Flag $8.;
set Have (keep = Variable Value);
Flag = 'UnkCode';
if (Variable = 'Gender' and Value in ('F','M','O','U')) then Flag =" ";
else if (Variable = 'Race' and Value in ('B','A')) then Flag =" ";
run;
quit;