我有一些个人健康数据,我需要从一组四个读数中计算平均血压读数。但是,必须遵循条件规则来计算平均值。我正在使用四个收缩压读数(s1, s2, s3
和s4
)。规则如下:
s4
,则血压读数为(s1 + s2)/ 2 s4
不缺失且s2,s3和s4相等,则平均s2,s3和s4的最大两个值。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中选择跨变量的值时遇到了麻烦。
非常感谢任何帮助。
答案 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;