首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将第一次记录的温度恢复正常?

如何将第一次记录的温度恢复正常?
EN

Stack Overflow用户
提问于 2019-04-02 09:54:06
回答 2查看 46关注 0票数 1

将临时温度的第一个记录标记为正常值(不超过37C)。

代码语言:javascript
运行
复制
    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;

以下是一个问题:

如何将临时温度的第一个记录标记为正常值(不超过37C)。

这里有2例患者各有6次温度观察,2例各有4次温度观察。如果病人的体温最终达到正常(最后一次体温< 37),那么,标记出低于37的第一个温度记录。

以ID = 001病人为例。

代码语言:javascript
运行
复制
001  1  37.3
001  2  37.2
001  3  36.3
001  4  37.3
001  5  36.9
001  6  36.9

由于第六温度纪录是36.9,小于37,最终恢复正常,然后,标出第五记录。

代码语言:javascript
运行
复制
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。

代码语言:javascript
运行
复制
003  1  37.3
003  2  37.1
003  3  38.2
003  4  39.3

因为这个病人的最后体温大于37。结果应该是:

代码语言:javascript
运行
复制
003  1  37.3  0
003  2  37.1  0
003  3  38.2  0
003  4  39.3  0

这个问题真让我失望。我非常感谢你的帮助,非常感谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-08 07:20:25

很好的问题,我也一直在研究这个问题。

秘密是从头到尾查一遍。

代码语言:javascript
运行
复制
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语句对于防止在发现一个观测值Temp大于37的情况下继续搜索非常重要。

票数 1
EN

Stack Overflow用户

发布于 2019-04-02 10:08:45

我把它处理好了。

代码语言:javascript
运行
复制
    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; 

我的想法是

  1. 使用虚拟变量dontflaganymore来知道我们是否已经标记了温度(为<37)。
  2. 保留而不是虚拟变量,以便能够在下一行使用它。
  3. 每次我们有一个新的ID (by ID; if first.ID then do;)时,重新设置这个变量
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55471828

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档