Условная транспонирование с использованием SAS - PullRequest
0 голосов
/ 07 мая 2019

У меня есть набор данных, который выглядит следующим образом для нескольких пациентов.Я пытаюсь вычесть каждое значение посещения из базового значения соответствующих переменных (которые иногда отсутствуют).

Data Have: 
Patient Variable Value  Visit 
A       Height    100   Baseline
A       Weight     50   Baseline
A       HDCIRC     30   Baseline
A       BMI        50   Baseline
A       Height    100   a
A       Weight     50   a
A       HDCIRC     30   a
A       BMI        50   a
A       Height    100   b
A       Weight     50   b

Data Want: 
Patient Variable Value  Visit     BASELINE  Change 
A       Height    100   Baseline   100       0
A       Weight     50   Baseline   50        0
A       HDCIRC     30   Baseline   30        0
A       BMI        50   Baseline   50        0
A       Height    120   a          100       20
A       Weight     50   a          50        0
A       HDCIRC     30   a          30        0
A       BMI        34.7 a          50        -15.3
A       Height    150   b          100       50
A       Weight     51   b          50        1

Моя попытка будет сначала создать BASELINE, а затем рассчитать изменение.Чтобы получить BASELINE, я видел, как некоторые люди используют функцию lag или dif.Как я могу правильно создать переменную BASELINE?

proc sort data=have;
by patient visit;
;

data want;
set have;
by patient visit;
difstamp = dif(visit);
if first.patient then do;
  dif=0;
end;
else dif=difstamp;
drop difstamp;
run;

proc sort data=want;
by timestamp;
run;

Ответы [ 2 ]

1 голос
/ 08 мая 2019

В качестве альтернативы вы можете просто объединить иметь с собой

data have;
input Patient $ Variable $ Value Visit $;
cards;
A       Height    100   Baseline
A       Weight     50   Baseline
A       HDCIRC     30   Baseline
A       BMI        50   Baseline
A       Height    120   a
A       Weight     50   a
A       HDCIRC     30   a
A       BMI        34.7 a
A       Height    150   b
A       Weight     51   b
;

proc sort;
 by patient variable;
run;
data want;
  merge have have(where=(__visit='Baseline') keep=patient variable value visit rename=(visit=__visit value=BASELINE))
  ;
  by patient variable;
  Change=Value-BASELINE;
  drop __:;
run;
1 голос
/ 07 мая 2019

Вероятно, это помогает сортировать по переменному ПАЦИЕНТА, чтобы вы могли получить базовый уровень. Если ваша переменная VISIT неправильно сортирует BASELINE к первому посещению, вы можете использовать параметры WHERE = dataset, чтобы убедиться, что базовая линия появляется первой.

data have;
input Patient $ Variable $ Value Visit $;
cards;
A       Height    100   Baseline
A       Weight     50   Baseline
A       HDCIRC     30   Baseline
A       BMI        50   Baseline
A       Height    120   a
A       Weight     50   a
A       HDCIRC     30   a
A       BMI        34.7 a
A       Height    150   b
A       Weight     51   b
;

proc sort;
 by patient variable visit;
run;
data want;
  set have(in=in1 where=(visit='Baseline'))
      have(in=in2 where=(visit^='Baseline'))
  ;
  by patient variable ;
  if first.variable then do;
    if in1 then baseline=Value;
    else baseline=.;
    retain baseline;
  end;
  if n(value,baseline)=2 then change=value-baseline;
run;

Результат:

Obs    PATIENT    VARIABLE    VALUE    VISIT       BASELINE    CHANGE

   1       A        BMI         50.0    Baseline        50         0.0
   2       A        BMI         34.7    a               50       -15.3
   3       A        HDCIRC      30.0    Baseline        30         0.0
   4       A        HDCIRC      30.0    a               30         0.0
   5       A        Height     100.0    Baseline       100         0.0
   6       A        Height     120.0    a              100        20.0
   7       A        Height     150.0    b              100        50.0
   8       A        Weight      50.0    Baseline        50         0.0
   9       A        Weight      50.0    a               50         0.0
  10       A        Weight      51.0    b               50         1.0
...