sas if then else statement

时间:2016-04-08 21:24:38

标签: if-statement sas

我在下面有这个代码,我需要它将elig_factor [2]设置为1,当status为= 1且hudadmin为1或2或3时,设置为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;

2 个答案:

答案 0 :(得分:2)

当你说:

时,你几乎自己回答了这个问题
  

当状态为= 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语句,设置{{1 }} 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'; 运算符

int shared_variable;

int get_shared_variable() {
    int result;

    pthread_mutex_lock(&shared_variable_mutex);
    result = shared_variable;
    pthread_mutex_unlock(&shared_variable_mutex);

    return result;
}

void* thread_routine(void *arg) {
    while (get_shared_variable() < 5000) {
        printf();
        printf();
        sleep(2);

        int i = 0;
        while (pthread_mutex_trylock(&foo_mutexes[i]) != 0) {
            i++;

            pthread_mutex_lock(&foo_count_mutex);
            if (i == foo_count) {
                pthread_mutex_unlock(&foo_count_mutex);
                sleep(1); // wait one second and retry
                i = 0;
            }

            pthread_mutex_unlock(&foo_count_mutex);
        }

        pthread_mutex_lock(&shared_variable_mutex);
        shared_variable += 10;
        pthread_mutex_unlock(&shared_variable_mutex);
    }

    return NULL; 
}

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

答案 1 :(得分:1)

如果使用布尔结果,这实际上更容易。下面唯一的区别是它会返回数字结果 - 如果您必须将'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;