【问题标题】:sas if then else statementsas if then else 语句
【发布时间】:2016-04-08 21:24:37
【问题描述】:

我在下面有这段代码,当状态为 =1 且 hudadmin 为 1 或 2 或 3 时,我需要将 elig_factor[2] 设置为 1,否则设置 elgi_factor[2] =0。但它仍然设置 elig_factor[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;

【问题讨论】:

    标签: if-statement sas


    【解决方案1】:

    当你说的时候,你几乎自己回答了这个问题:

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

    我不确定你为什么没有在这里使用in 运算符。

    无论如何,解释一下你的代码实际上在做什么:

    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 语句,忽略过去if 语句的结果。因此,如果您遇到hudadmin = 1 的情况,则触发第一个if 语句,将elig_factor[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',如果不是则检查'3',仅在检查hudadmin 不是'1''2''3' 后,然后它将设置elig_factor[2] = '0'

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

    使用in 运算符

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

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

    【讨论】:

    • 谢谢你说得对,现在可以了。非常感谢。
    【解决方案2】:

    如果您使用布尔结果,这实际上会更容易。下面唯一的区别是它返回数字结果——如果你必须有'1'然后put每个字符或将它们中的每一个包装在cats中。

     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;
    

    【讨论】: