在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中的值串联到新行中以创建唯一标识符。
是否有更简单的方法来解决此问题?
我更喜欢一种为值的特定组合分配特定标识符的方法,而不是每当出现一个新的组合时即生成任意任意唯一字符串的方法。
答案 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;
答案 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