将 TEMP 的第一条记录标记为正常(不超过 37C(。
data temp;
input ID $ SEQ $ TEMP ;
datalines;
001 1 37.3
001 2 37.2
001 3 36.3
001 4 37.3
001 5 36.9
001 6 36.9
002 1 37.3
002 2 37.2
002 3 36.3
002 4 35.3
002 5 36.9
002 6 36.9
003 1 37.3
003 2 37.1
003 3 38.2
003 4 39.3
004 1 36.3
004 2 38.2
004 3 36.5
004 4 36.4
;
run;
问题是:
如何将 TEMP 的第一条记录标记回正常(不超过 37C(。
这里有 2 名患者,每位患者有 6 个温度观察,2 名患者每人有 4 个温度观察。如果患者的体温最终恢复正常(最后体温<37(,那么,标记出第一个小于37的温度记录。
以ID = 001患者为例。
001 1 37.3
001 2 37.2
001 3 36.3
001 4 37.3
001 5 36.9
001 6 36.9
由于第 6 个临时记录是 36.9,小于 37,终于恢复正常,然后,标记出第 5 个记录。
001 1 37.3 0
001 2 37.2 0
001 3 36.3 0
001 4 37.3 0
001 5 36.9 1
001 6 36.9 0
对于患者 ID = 003。
003 1 37.3
003 2 37.1
003 3 38.2
003 4 39.3
由于该患者的最后温度大于37。结果应如下所示:
003 1 37.3 0
003 2 37.1 0
003 3 38.2 0
003 4 39.3 0
这个问题真的让我很沮丧。我将非常感谢您的帮助,非常感谢。
我得到了它。
data temp;
set temp;
retain dontflaganymore;
by ID;
if first.ID then dontflaganymore=0;
if TEMP<37 AND not dontflaganymore then do; flag=1; dontflaganymore=1; end;
else flag=.;
drop dontflaganymore;
run;
这个想法是
使用虚拟变量
dontflaganymore
来了解我们是否已经标记了温度(为 <37(。保留比虚拟变量能够在下一行使用它。
- 并在每次我们有新 ID 时重置该变量 (
by ID; if first.ID then do;
(
非常好的问题,我也一直在研究这个问题。
秘诀是从最后一个到第一个查找。
data TempRst;
set Temp nobs = nobs;
by ID SEQ;
LagTemp = Lag(Temp);
if first.ID then LagTemp = .;
do i = nobs to _N_ by -1;
set Temp(rename=(ID=IDTmp SEQ=SEQTmp Temp=TempTmp)) point = i;
if ID = IDTmp and SEQ < SEQTmp and TempTmp > 37 then do;
Flag = 0;
leave;
end;
if ID = IDTmp and SEQ < SEQTmp and Temp < 37 and LagTemp > 37 then Flag = 1;
end;
Flag = coalesce(Flag,0);
drop IDTmp SEQTmp TempTmp LagTemp;
run;
而且leave
陈述非常重要,以防止在发现一个观察结果比 37 Temp
更刨丝后继续搜索。