Условное вычитание в том же столбце с использованием SAS - PullRequest
0 голосов
/ 18 марта 2020

Вот часть набора данных, который я назвал «антителом»:

Row          Subject        Type               Procedure           Measurement              Output
1               500         Intial              Invasive             20                        20
2               500          Initial            Surface              35                        35
3               500          Followup          Invasive             54                        54-20
4               428          Followup          Outer                 29                        29-10
5               765          Seventh           Other                 13                       13-19
6                500          Followup          Surface              98                       98-35
7                428          Initial             Outer            10                        10                
8                765          Initial              Other            19                        19     
9                610          Third              Invasive            66                       66-17
10               610          Initial             Invasive            17                       17

Я пытался использовать pro c sql для этого. Цель состоит в том, чтобы вычесть числа в столбце «ИЗМЕРЕНИЕ» на основе столбцов «ПРЕДМЕТ», «ТИП» и «ПРОЦЕДУРА». Если два значения в столбце «ПРЕДМЕТ» совпадают и два значения в столбце «ПРОЦЕДУРА» совпадают, то из другого измерения следует вычесть начальное измерение. Например, начальное измерение в строке 1 (20) должно быть вычтено из последующего измерения в строке 3 (54), поскольку субъект (500) и процедура (инвазивный) совпадают. Кроме того, начальное измерение в строке 8 (19) должно быть вычтено из седьмого измерения в строке 5 (13), поскольку субъект (765) и процедура (Другое) совпадают. Результат должен сформироваться в столбце «ВЫХОД».

Заранее спасибо!

1 Ответ

0 голосов
/ 18 марта 2020

Вот га sh объектный подход

data have;
input Subject Type $ 5-12 Procedure $ 15-22 Measurement;
datalines;
500 Initial   Invasive  20 
500 Initial   Surface   35 
500 Followup  Invasive  54 
428 Followup  Outer     29 
765 Seventh   Other     13 
500 Followup  Surface   98 
428 Initial   Outer     10 
765 Initial   Other     19 
610 Third     Invasive  66 
610 Initial   Invasive  17 
;

data want (drop=rc _Measurement);
   if _N_ = 1 then do;
      declare hash h (dataset : "have (rename=(Measurement=_Measurement) where=(Type='Initial'))");
      h.definekey ('Subject');
      h.definedata ('_Measurement');
      h.definedone();
   end;

   set have;
   _Measurement=.;

   if Type ne 'Initial' then rc = h.find();
   Measurement = sum (Measurement, -_Measurement);
run;

РЕДАКТИРОВАТЬ:

data want (drop=rc _Measurement);
   if _N_ = 1 then do;
      declare hash h (dataset : "have (rename=(Measurement=_Measurement) where=(Type='Initial'))");
      h.definekey ('Subject');
      h.definedata ('_Measurement');
      h.definedone();
   end;

   set have;
   _Measurement=.;

   if Type ne 'Initial' then rc = h.find();
   NewMeasurement = ifn(Measurement=., ., sum (Measurement, -_Measurement));
run;
...