In SAS: Wie Flag einzigartigen Kombinationen aus einer Reihe von Variablenwerten

stimmen
2

In SAS, wie kann ich eine Kennung für jede eindeutige Kombination aus einer Reihe von Variablen erstellen?

Ich habe zum Beispiel eine mehrere tausend Beobachtungen mit einem dichotomous Wert für sechs Variablen. Es gibt 2 ^ 6 einzigartige Kombinationen für die Werte dieser Variablen für jede Beobachtung. Ich möchte eine Kennung für jede eindeutige Kombination schaffen, und schließlich Gruppe meinen Beobachtungen nach diesem Wert.

Haben:

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  

Wollen:

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

Adarstellen würde 1, 1, 1, 1, 1, 1 als eine einzigartige Kombination und B0 darstellen würde, 1, 1, 1, 1, 1 usw.

Ich habe darüber nachgedacht, einen Dummy-Variable auf 64 Var1-Var6 bedingte Aussagen, die erzeugt wird. Ich habe auch gedacht, um die Werte von Var1-Var6 in eine neue Zeile verketten eine eindeutige Kennung zu erstellen.

Gibt es einen einfacheren Weg, um darüber zu gehen?

Ich ziehe es einen Ansatz, der eine spezifische Kennung auf eine bestimmte Kombination der Werte zuordnet, sondern als eine, die nur einige beliebige eindeutige Zeichenfolge erzeugt, sobald eine neue Kombination kommt.

Veröffentlicht am 27/11/2018 um 17:55
quelle vom benutzer
In anderen Sprachen...                            


4 antworten

stimmen
1

Proc Zusammenfassung funktioniert gut mit der Option Ebenen. Diese Technik funktioniert für beliebige Werte der Gruppenvariablen numerisch oder Zeichen.

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;

Geben Sie hier image description

Beantwortet am 28/11/2018 um 00:35
quelle vom benutzer

stimmen
0

Angenommen, die Daten werden durch Ihre Gruppenvariablen sortiert dann BY Gruppenverarbeitung verwenden nur.

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

Oder Sie könnten nur die 6 Binärgrößen in einen einzigen eindeutigen Wert umwandeln.

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

Dies hat den Mehrwert nicht erforderlich ist, die Daten zu sortieren, aber es für keine der Gruppenvariablen fehlen werden muss.

Ergebnis

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
Beantwortet am 27/11/2018 um 20:37
quelle vom benutzer

stimmen
0

Durch die Verwendung von Kombinationen die einzigartigen Werte der angegebenen Variablen, und dann eine alphabetische Liste des Ids erstellen, können Sie das Ergebnis erstellen

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;
Beantwortet am 27/11/2018 um 19:00
quelle vom benutzer

stimmen
0

Warum nicht einfach die Werte verketten? So Ihre Kombinationen sind:

111111
111110
111101
111011
110111
....

Sie können PROC FREQ verwenden, um die Anzahl der einzelnen Arten zu überprüfen.

proc freq data=have;
table var1*var2*var3*var4*var5*var6 / out=want list;
run;
Beantwortet am 27/11/2018 um 18:29
quelle vom benutzer

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