Как отключить первую запись TEMP до нормальной? - PullRequest
1 голос
/ 02 апреля 2019

Пометить первую запись 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. </p>

Возьмите 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

Этот вопрос меня очень расстроил. Я был бы очень признателен за вашу помощь, большое спасибо.

Ответы [ 2 ]

2 голосов
/ 02 апреля 2019

Я понял, что это работает с этим.

    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). </p>

  2. оставьте пустую переменную, чтобы иметь возможность использовать ее в следующей строке.

  3. и сбрасывать эту переменную каждый раз, когда у нас есть новый идентификатор (by ID; if first.ID then do;)
1 голос
/ 08 апреля 2019

Очень хороший вопрос, я тоже работал над этим.
Секрет в поиске от последнего к первому.

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.

...