Sas 如何将TEMP的第一条记录标记为恢复正常?

Sas 如何将TEMP的第一条记录标记为恢复正常?,sas,Sas,将温度的第一个记录标记回正常(不超过37摄氏度) 问题是: 如何标记出温度恢复正常(不超过37℃)的第一条记录 这里有2名患者各6次体温观察,2名患者各4次体温观察。如果患者的体温最终恢复正常(最后一次体温

将温度的第一个记录标记回正常(不超过37摄氏度)

问题是:

如何标记出温度恢复正常(不超过37℃)的第一条记录

这里有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; 
数据温度;
设定温度;
不再保留Dontflag;
按身份证;
如果first.ID,则dontflagore=0;

如果这个问题问得很好,我也一直在研究这个问题。
秘密在于从最后一个查找到第一个

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;
数据温度;
设置温度nobs=nobs;
按ID SEQ;
滞后温度=滞后(温度);
如果为first.ID,则为LagTemp=。;
do i=nobs to _N_ u by-1;
设置温度(重命名=(ID=IDTmp SEQ=SEQTmp Temp=TENTMP))点=i;
如果ID=IDTmp和SEQ37,则执行该操作;
Flag=0;
离开
结束;
如果ID=IDTmp,SEQ37,则Flag=1;
结束;
标志=合并(标志,0);
下降IDTmp SEQTmp TENTMP LagTemp;
跑

并且
leave
语句非常重要,可以防止在找到一个
Temp
大于37的观察值后继续搜索。

很好,您提供了示例数据集!包括您尝试的代码也很重要。
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;