在SAS中:如何标记一组变量值的唯一组合

时间:2018-11-27 17:55:12

标签: sas

在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、1作为唯一组合,而B将表示0、1、1、1、1、1等。

我考虑过要基于64个Var1-Var6条件语句创建一个虚拟变量。我还考虑过将Var1-Var6中的值串联到新行中以创建唯一标识符。

是否有更简单的方法来解决此问题?

我更喜欢一种为值的特定组合分配特定标识符的方法,而不是每当出现一个新的组合时即生成任意任意唯一字符串的方法。

4 个答案:

答案 0 :(得分:1)

过程摘要与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

答案 1 :(得分:0)

为什么不仅仅将值连接起来? 因此,您的组合是:

111111
111110
111101
111011
110111
....

您可以使用PROC FREQ检查每种类型的编号。

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

答案 2 :(得分:0)

通过使用给定变量组合的唯一值,然后创建按字母顺序排列的ID列表,您可以创建结果

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;

答案 3 :(得分:0)

假设数据是按照分组变量排序的,则只需使用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