В SAS: Как пометить уникальные комбинации набора значений переменных - PullRequest
0 голосов
/ 27 ноября 2018

Как в SAS создать идентификатор для каждой уникальной комбинации набора переменных?

У меня есть, например, несколько тысяч наблюдений с дихотомическим значением для шести переменных.Есть 2 ^ 6 уникальных комбинаций для значений этих переменных для каждого наблюдения.Я хотел бы создать идентификатор для каждой уникальной комбинации и в конечном итоге сгруппировать свои наблюдения в соответствии с этим значением.

Имею:

SubjectID     Var1     Var2     Var3     Var4     Var5     Var6
---------------------------------------------------------------
ID1           1        1        1        1        1        1        
ID2           1        0        1        1        1        1  
ID3           0        1        1        1        1        1  
ID4           0        0        1        1        1        0  
...           ...      ...      ...      ...      ...      ...
ID3000        1        1        0        1        0        0  

Хочу:

SubjectID     Var1     Var2     Var3     Var4     Var5     Var6     Identifier
------------------------------------------------------------------------------
ID1           1        1        1        1        1        1        A        
ID2           1        1        1        1        1        1        A
ID3           0        1        1        1        1        1        B  
ID4           0        0        1        1        1        0        C  
...           ...      ...      ...      ...      ...      ...
ID3000        1        1        0        1        0        0        Z

A будет представлять 1, 1, 1, 1, 1, 1 как уникальную комбинацию, а B будет представлять 0, 1, 1, 1, 1, 1 и т. Д.

Я думал о созданиификтивная переменная, основанная на 64 условных выражениях Var1-Var6.Я также подумал о объединении значений из Var1-Var6 в новую строку для создания уникального идентификатора.

Есть ли более простой способ сделать это?

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

Ответы [ 4 ]

0 голосов
/ 28 ноября 2018

Proc summary хорошо работает с опцией LEVELS.Этот метод работает для любых значений групповых переменных числовых или символьных.

data have;
   input (v1-v6)(1.);
   cards;
111111
111110
111101
111011
110111
;;;;
proc print;
proc summary data=have nway;
   class v1-v6;
   output out=unique(drop=_type_) / levels;
   run;

enter image description here

0 голосов
/ 27 ноября 2018

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

data inp;
length combined $6.;
input subjectid $4. v1 1. v2 1. v3 1. v4 1. v5 1. v6 1.;
combined=compress(v1||v2||v3||v4||v5||v6);
datalines;
ID1 111111
ID2 011111
ID3 001111
ID4 111110
ID5 000111
ID6 111111
ID7 000111
;
run;

proc sql;
create table uniq
as
select distinct combined from inp order by combined desc;
quit;

data uniq1;
 set uniq;
 retain alphabet 65;
 Id=byte(alphabet) ;
 alphabet+1;

 drop alphabet;
run;

proc sql;
create table final_ds
as
select subjectid, v1, v2, v3, v4, v5, v6, Id
from inp a
left join uniq1 b
on a.combined=b.combined;
quit;
0 голосов
/ 27 ноября 2018

Если данные отсортированы по группируемым переменным, просто используйте обработку группы BY.

data want;
  set have;
  by var1-var6 ;
  groupid + first.var6 ;
run;

Или вы можете просто преобразовать 6 двоичных переменных в одно уникальное значение.

group2 = input(cats(of var1-var6),binary6.);

Это имеет дополнительное преимущество: не требуется сортировать данные, но необходимо, чтобы ни одна из переменных группировки не отсутствовала.

Результат

SubjectID  Var1 Var2 Var3 Var4 Var5 Var6 Identifier Want groupno group2
ID4  0  0  1  1  1  0 C  1  14
ID3  0  1  1  1  1  1 B  2  31
ID1  1  1  1  1  1  1 A  3  63
ID2  1  1  1  1  1  1 A  3  63
0 голосов
/ 27 ноября 2018

Почему бы просто не объединить значения?Итак, ваши комбинации:

111111
111110
111101
111011
110111
....

Вы можете использовать PROC FREQ для проверки номера каждого типа.

proc freq data=have;
table var1*var2*var3*var4*var5*var6 / out=want list;
run;
...