Em SAS: Como bandeira combinações únicas de um conjunto de valores de variáveis

votos
2

Em SAS, como posso criar um identificador para cada combinação única de um conjunto de variáveis?

Eu tenho, por exemplo, um vários milhares de observações com um valor dicotômica por seis variáveis. Existem 2 ^ 6 combinações únicas para os valores destas variáveis ​​para cada observação. Eu gostaria de criar um identificador para cada combinação única e, eventualmente, grupo minhas observações de acordo com este valor.

Ter:

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  

Quer:

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

Arepresentaria 1, 1, 1, 1, 1, 1 como uma combinação única e Biria representar 0, 1, 1, 1, 1, 1, etc.

Eu tenho pensado sobre a criação de uma variável dummy com base em 64 declarações condicionais Var1-Var6. Eu também pensei sobre concatenando os valores de Var1-Var6 em uma nova linha para criar um identificador único.

Existe uma maneira mais simples de ir sobre isso?

Eu prefiro uma abordagem que atribui um identificador específico para uma combinação específica dos valores, ao invés de um que apenas gera alguma cadeia exclusiva arbitrária sempre que uma nova combinação vem à tona.

Publicado 27/11/2018 em 17:55
fonte usuário
Em outras línguas...                            


4 respostas

votos
1

resumo Proc funciona bem com a opção de níveis. Esta técnica funciona para quaisquer valores das variáveis ​​do grupo numéricos ou de caracteres.

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;

digite descrição da imagem aqui

Respondeu 28/11/2018 em 00:35
fonte usuário

votos
0

Supondo que os dados são classificados por suas variáveis ​​de agrupamento em seguida, basta usar pelo processamento de grupo.

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

Ou você poderia apenas converter os 6 variáveis ​​binárias em um único valor único.

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

Isto tem o valor acrescentado de não exigir que você classificar os dados, mas não precisa de nenhuma das variáveis ​​de agrupamento estar faltando.

Resultado

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
Respondeu 27/11/2018 em 20:37
fonte usuário

votos
0

Usando os valores exclusivos de combinações das variáveis ​​dadas e, em seguida, criar um alfabética lista de IDs, você pode criar o resultado

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;
Respondeu 27/11/2018 em 19:00
fonte usuário

votos
0

Porque não basta concatenar os valores? Assim, suas combinações são:

111111
111110
111101
111011
110111
....

Você pode usar PROC FREQ para verificar o número de cada tipo.

proc freq data=have;
table var1*var2*var3*var4*var5*var6 / out=want list;
run;
Respondeu 27/11/2018 em 18:29
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more