在SAS中,使用具有不同变量的条件逻辑来计算值

时间:2013-08-27 16:36:03

标签: selection sas calculated-columns

我有一些个人健康数据,我需要从一组四个读数中计算平均血压读数。但是,必须遵循条件规则来计算平均值。我正在使用四个收缩压读数(s1, s2, s3s4)。规则如下:

  1. 如果缺少s4,则血压读数为(s1 + s2)/ 2
  2. 如果s4 缺失且s2,s3和s4相等,则平均s2,s3和s4的最大两个值。
  3. 如果s4 缺失且s2,s3和s4 等距离,则将两个最接近的值平均。
  4. 我考虑过使用数组和proc转置,但是想知道是否有更优雅的方法来解决这个问题。

    示例数据包含在下面:


    data bp;
    input id s1 s2 s3 s4;
    cards;
    001              140            147            145            143
    002              136            135            126            130
    004              168            152            156              .
    005              137            138            137              .
    006              156            154            155              .
    007              138            146            134            138
    012              127            133            135              .
    013              112            112            100             88
    017              127            122            126              .
    019              137            138            150            135
    020              109            118            113            116
    021              112            112            109            107
    022              119            136            129            130
    026              119            108            116            118
    027              126            120            130            123
    028              143            143            135            139
    029              144            143            117            137
    030              116            114            108            110
    032              135            146            139            134
    041              128            128            132              .
    run;
    
    
    
    
    data bp_2; set bp_1;
    
     s_dif2 =    abs(s3-s2) ;
     s_dif3 =    abs(s4-s3) ;
    
    run;
    

    第一个条件很容易编码,但我在SAS中选择​​跨变量的值时遇到了麻烦。

    非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

我将变量放入临时数组并对该数组(CALL SORTN)进行排序,以确保哪个变量最大/最小。

data want;
set bp;
if missing(s4) then bp = (s1+s2)/2;
else do;
  array _s[4] _temporary_;
  array s[4];  *this stores s1,s2,s3,s4 into an array;
  do _t = 2 to dim(_s);
    _s[_t] = s[_t];
  end;
  call sortn(of _s[*]); *this sorts the _s array, and _s[1] will stay as missing.  That way we know where the smallest/largest are.;
  if abs(_s[2]-_s[3]) = abs(_s[3]-_s[4]) then bp = (_s[3]+_s[4])/2; *exactly equidistant - if you have some tolerance fix this if here;
  else if abs(_s[2]-_s[3]) < abs(_s[3]-_s[4]) then bp=(_s[2]+_s[3])/2;
  else bp = (_s[3]+_s[4])/2;
end;
run;