Объединить имена столбцов с ненулевыми значениями - PullRequest
0 голосов
/ 30 мая 2018

Существует таблица с идентификатором, событием, датой.

Текущий сценарий подсчитывает события по идентификатору, типу события и дате, транспонирует и затем маркирует каждый идентификатор по комбинации типов событий в этот день.

Проблема заключается в том, что это происходит, если появляются новые типы событий.

Я надеюсь найти метод, который берет все имена столбцов с ненулевым количеством и объединяет их.В идеале этот метод не требует жесткого кодирования событий.

data test;
infile datalines delimiter=':' truncover;
informat id 10.  event_dt DDMMYY10. event_type $10. event $10.;
input id event_dt event_type event;
datalines;
1:01-03-2017:BB:b1
1:01-03-2017:AA:A2
1:02-03-2017:CC:C1
2:01-03-2017:CC:C2
3:03-03-2017:BB:b2
4:02-03-2017:AA:A1
;
run;


proc sql;
    create table test2 as
    select distinct ID, event_dt format worddate. as event_dt, event_type, count(distinct event) as event_count
    from test 
    group by ID, event_dt, event_type;
quit;

proc transpose data=test2 out=test3 (drop =  _name_);
by id event_dt;
id event_type;
run;

proc stdize data=test3  out=test3z reponly missing=0;
   run;


proc sql;
    create table test4 as
    select event_dt,
    case when AA = 0 and BB = 0 and CC = 0 then 'No Event'
         when AA = 0 and BB = 0 and CC > 0 then 'CC only'
         when AA = 0 and BB > 0 and CC = 0 then 'BB only'
         when AA = 0 and BB > 0 and CC > 0 then 'BB & CC'
         when AA > 0 and BB = 0 and CC = 0 then 'AA only'
         when AA > 0 and BB = 0 and CC > 0 then 'AA & CC'
         when AA > 0 and BB > 0 and CC = 0 then 'AA & BB'
         when AA > 0 and BB > 0 and CC > 0 then 'AA & BB & CC'
         else 'Other' end as tag, count(id) as ID_COUNT
    from test3z group by 
        event_dt,
    case when AA = 0 and BB = 0 and CC = 0 then 'No Event'
         when AA = 0 and BB = 0 and CC > 0 then 'CC only'
         when AA = 0 and BB > 0 and CC = 0 then 'BB only'
         when AA = 0 and BB > 0 and CC > 0 then 'BB & CC'
         when AA > 0 and BB = 0 and CC = 0 then 'AA only'
         when AA > 0 and BB = 0 and CC > 0 then 'AA & CC'
         when AA > 0 and BB > 0 and CC = 0 then 'AA & BB'
         when AA > 0 and BB > 0 and CC > 0 then 'AA & BB & CC'
         else 'Other' end;
quit;

Спасибо, Бен

1 Ответ

0 голосов
/ 30 мая 2018

Кто-то может сказать, транспонировать и использовать массивы.

Рассмотреть эту альтернативу - вместо назначения значения тега путем обработки явных столбцов в строке.

Вычислить значение тега при выполнении итерациигруппа идентификаторов / дат, сортировка и подсчет идентификаторов при переборе группы дат / тегов.

* same as in question;
proc sql;
    create table test2 as
    select distinct ID, event_dt format worddate. as event_dt, event_type, count(distinct event) as event_count
    from test 
    group by ID, event_dt, event_type;
quit;

* compute tag value (I call it type_list);
data test2a;
  length type_list $30;
  do _n_ = 1 by 1 until (last.event_dt);
    set test2;
    by ID event_dt;
    type_list = catx(',',type_list,event_type);
  end;
  keep id event_dt type_list;
run;

proc sort data=test2a;
  by event_dt type_list;
run;

* count number of ids with same type list on each event day;
data want;
  do id_count = 1 by 1 until (last.type_list);
    set test2a;
    by event_dt type_list;
  end;
run;

Вы можете добавить дополнительную логику и tranwrd, чтобы изменить список типов (a csv *).1010 * список) в более подробное представление (содержит слова и или & или * только 1015 * )

...