SAS: разница строк - PullRequest
       16

SAS: разница строк

1 голос
/ 27 июня 2019

Я должен рассчитать разницу между первой датой в момент времени = 0 и датами после.У меня также есть одна переменная = фактор, который имеет 2 категории: одна;два.

Например, вот одна дата:

A             B       TIME
10/11/2016    one      T0
17/11/2016    two      T0
05/01/2017    one      T1
28/02/2017    two      T1
06/07/2017    one      T2
05/09/2017    two      T2

Я хотел бы рассчитать разницу между T0 и датами для B = "one" и B = "two", чтобыполучить:

DIFF
0
0
56 
103
238
292

Расчет разницы следующим образом:

56 = T1-T0 for "one" = 05/01/2017 - 10/11/2016  
103 = T1-T0 for "two" = 28/02/2017 - 17/11/2016   
238 = T2-T0 for "one" = 06/07/2017 - 10/11/2016
292 = T2-T0 for "two" = 05/07/2017 - 17/11/2016

Не могли бы вы помочь мне сделать это в SAS?

Большое спасибо.

Ответы [ 2 ]

3 голосов
/ 27 июня 2019

Один из способов - извлечь записи TIME = 'T0' и объединить их с другими записями.

Сначала давайте преобразуем вашу таблицу в набор данных.

data have ;
  input b $ Time $ date :yymmdd.;
  format date yymmdd10.;
cards;
one T0 2016-11-10
two T0 2016-11-17
one T1 2017-01-05
two T1 2017-02-28
one T2 2017-07-06
two T2 2017-09-05
;

Теперь давайте изменим порядок, чтобы мы могли объединить с помощью переменной группировки, B.

proc sort ;
  by b time ;
run;

Вот способ объединения данных с самим собой.

data want ;
  merge have(where=(time ne 'T0')) 
        have(keep=time b date rename=(time=time0 date=date0) where=(time0='T0'))
  ;
  by b ;
  diff = date - date0;
  drop time0;
run;

Результаты:

Obs     b     Time          date         date0    diff

 1     one     T1     2017-01-05    2016-11-10      56
 2     one     T2     2017-07-06    2016-11-10     238
 3     two     T1     2017-02-28    2016-11-17     103
 4     two     T2     2017-09-05    2016-11-17     292
1 голос
/ 27 июня 2019

Конечно, есть несколько способов сделать это. Ниже приведены две альтернативы. Первый выбирает первый A для каждого B и объединяет его с исходными данными в SQL-шаге. Второй использует DATA-шаг и по группам. Первый A в каждом B сохраняется как первый раз и сохраняется, чтобы его можно было использовать для расчета разницы.

data test;
    input A  ddmmyy10. @12 B $3.;
    format A ddmmyy10.;
datalines;
10/11/2016 one
17/11/2016 two
05/01/2017 one
28/02/2017 two
06/07/2017 one
05/09/2017 two
;

/*  Alt 1*/
proc sql;
    create table test2 as 
    select t1.*, t1.A-t2.A as time
    from test as t1 left join (select B, min(A) as A from test group by 1) as t2
        on t1.B=t2.B
    order by A;

/* Alt 2*/
proc sort data=test;
    by B A;
run;

data test3;
    set test;
        by B;
    retain firsttime;
    if first.B then firsttime=A;
    time=A-firsttime;
    drop firsttime;
run;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...