If statement sas if then else语句

If statement sas if then else语句,if-statement,sas,If Statement,Sas,我有下面的代码,我需要它将elig_因子[2]设置为1,当状态为=1且hudadmin为1或2或3时,否则设置elgi_因子[2]=0。但它将elig_因子[2]=0。有人能帮忙吗 if ("&r_start" eq 1) then do; if ( 2011<=built <= 2014) then elig_factor[1] = '1'; else elig_factor[1] = '0'; if (status eq '1' and hudadmin eq

我有下面的代码,我需要它将elig_因子[2]设置为1,当状态为=1且hudadmin为1或2或3时,否则设置elgi_因子[2]=0。但它将elig_因子[2]=0。有人能帮忙吗

if ("&r_start" eq 1) then 
 do;
 if ( 2011<=built <= 2014) then elig_factor[1] = '1';
 else elig_factor[1] = '0';

 if (status eq '1' and hudadmin eq '1') then elig_factor[2] = '1';
    else elig_factor[2] = '0';
  if (status eq '1' and hudadmin eq '2') then elig_factor[2] = '1';
    else elig_factor[2] = '0';
  if (status eq '1' and hudadmin eq '3') then elig_factor[2] = '1';
    else elig_factor[2] = '0';


 if (np_all gt 0) then elig_factor[3] = '1';
   else elig_factor[3] = '0';
 if (np_black gt 0) then elig_factor[4] = '1';
   else elig_factor[4] = '0';
 if (np_age65 gt 0) then elig_factor[5] = '1';
   else elig_factor[5] = '0';
 if (np_hisp gt 0) then elig_factor[6] = '1';
   else elig_factor[6] = '0';

 elig_factor[7] = occ;
 elig_factor[8] =vac;
    end;
如果(“&r_start”等式1),则
做

如果(2011当你说:

当状态为=1且HUDAMIN为1或2或3时

我不知道您为什么没有在这里使用
操作符中的

无论如何,要解释您的代码实际上在做什么:

依次计算每个
if
语句,忽略过去
if
语句的结果。因此,如果出现
hudadmin=1
的情况,则触发第一个
if
语句,将
elig_因子[2]
设置为
'1'
,则忽略后续的
else

当到达第二个
if
语句时,它被检查并发现为
FALSE
,因此运行
else
语句,将
elig_factor[2]
设置为
'0'
,尽管之前已将其设置为
'1'

所以你有两个选择:

修改您的代码,使其符合您的要求

if (status eq '1' and hudadmin eq '1') then elig_factor[2] = '1';
else if (status eq '1' and hudadmin eq '2') then elig_factor[2] = '1';
else if (status eq '1' and hudadmin eq '3') then elig_factor[2] = '1';
else elig_factor[2] = '0';
这检查是否
hudadmin='1'
,如果不是,则检查是否
hudadmin='2'
,如果不是,则检查
hudadmin='3'
,仅在检查
hudadmin
不是
'1'
'2'
'3'
后,它将设置
elig u系数[2]='0'

代码是合理的,但有点过度设计,我将采用以下方法

使用
中的
操作符

if (status eq '1' and hudadmin in ('1','2','3')) then elig_factor[2] = '1';
else elig_factor[2] = '0';

这将在一条语句中检查条件,更容易阅读,而且可以说更有效。

如果使用布尔结果,这实际上更容易。下面唯一的区别是它返回数值结果-如果必须使用
'1'
,则
将它们每个放在一个字符中,或者将它们包装在

 if ("&r_start" eq 1) then 
 do;
   elig_factor[1] = ( 2011<=built <= 2014) ;
   elig_factor[2] = (status eq '1' and hudadmin in ('1','2','3'));
   elig_factor[3] = (np_all gt 0) ;
   elig_factor[4] = (np_black gt 0);
   elig_factor[5] = (np_age65 gt 0);
   elig_factor[6] = (np_hisp gt 0);
   elig_factor[7] = occ;
   elig_factor[8] = vac;
 end;
如果(“&r_start”等式1),则
做

elig_因子[1]=(2011谢谢你是对的,现在它起作用了。非常感谢。
 if ("&r_start" eq 1) then 
 do;
   elig_factor[1] = ( 2011<=built <= 2014) ;
   elig_factor[2] = (status eq '1' and hudadmin in ('1','2','3'));
   elig_factor[3] = (np_all gt 0) ;
   elig_factor[4] = (np_black gt 0);
   elig_factor[5] = (np_age65 gt 0);
   elig_factor[6] = (np_hisp gt 0);
   elig_factor[7] = occ;
   elig_factor[8] = vac;
 end;