SAS: уникальный идентификатор для нескольких столбцов с перекрывающимися значениями - PullRequest
0 голосов
/ 05 декабря 2018

Возьмите приведенный ниже пример кода, содержащий человека и его сеанс:

data test;
    length pers session $5;
    input pers $ session $;
    datalines;
    a   1
    a   2
    a   7
    b   2
    b   3
    c   3
    d   4
    e   5
    h   2
    ;
run;

Первые 6 записей и последняя запись должны иметь один и тот же уникальный идентификатор, потому что лица A, B и H связаны сессией 2,и Человек B (который связан с Человеком A) связан с Человеком C сессией 3.

, т.е. все 7 записей имеют связь через человека и / или сеанс.Если вы рассматриваете человека как «родителя», а сеанс - как «ребенка» в структуре узла, все связанные дети и родители должны быть в одном и том же UID.Любые перерывы должны быть отдельными UID.

Строки 7 и 8 (Лица D и E) будут иметь свои собственные уникальные идентификаторы, поскольку они не имеют перекрывающихся лиц или сеансов.Результат будет выглядеть примерно так:

Person|Session|Unique_ID
    a       1       UID1
    a       2       UID1
    a       7       UID1
    b       2       UID1
    b       3       UID1
    c       3       UID1
    h       2       UID1
    d       4       UID2
    e       5       UID3

Я пробовал транспонировать и многократные сохранения, но он становится хитрым, построчно, поскольку кажется, что вам нужно сохранить частичные совпадения, но затем вернуться к группировкам, еслиЕсть полные совпадения.Я мог бы обдумать это, но это кажется довольно сложным.

У кого-нибудь есть мысли о том, как мне этого добиться?

1 Ответ

0 голосов
/ 05 декабря 2018

Я снова изменил код, и он должен работать для упомянутых сценариев

proc sql;
create table test1 as 
select x.*, flag from 
(select * from test) x
 left join 
 (select distinct a.cust, case when a.dev = b.dev
 and a.cust ne b.cust then 1  end as flag from test a
 inner join
 test b
 on a.dev = b.dev
 and a.cust ne b.cust) y
 on x.cust = y.cust;



proc sort data =test1;
 by cust ;
 run;

  data test2;
  set test1;
   by cust;
   retain _flag;

   if flag = 1 then _flag = flag;
   else if  first.cust then  _flag +1;
  Unique_ID = cats("UID",_flag);
drop flag _flag ;
 run;
...