1

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

  1. 如果s4缺失,则血压读数为 (s1+s2)/2
  2. 如果s4没有缺失且 s2 s3 和 s4 等距,则平均 s2、s3 和 s4 的最大两个值。
  3. 如果s4没有缺失并且 s2、s3 和 s4等距,则对最接近的两个值进行平均

我考虑过使用数组和 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 中跨变量选择值时遇到了麻烦。

任何帮助是极大的赞赏。

4

1 回答 1

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;
于 2013-08-27T16:48:26.387 回答