您可以使用SORTC函数执行此操作,该函数将字符值数组按字母顺序排序:
http://support.sas.com/documentation/cdl/en/lrdict/64316/HTML/default/viewer.htm#a003106052.htm
一种方法是按字母顺序创建一个包含VAR1-VAR3值的新变量:
data want; length sorted_vars $ 20; set have; array vars[*] var1-var3; call sortc(of vars[*]); sorted_vars = cats(of vars[*]); run;
上面的代码没有经过测试,但应该非常接近。从那里,你可以排序 sorted_vars 增加你的 id_new 每个变量 first.sorted_vars 。
sorted_vars
id_new
first.sorted_vars
ID_NEW基于组合。每个独特的组合可以被认为是一个集合元素。 set元素是通过对数据值进行排序(将值排列转换为表示值组合的不同排列)并将它们与分隔符连接成单个值(即set元素)得到的。分隔确保了元素中贡献值的分离。 set元素也可以被认为是一个散列键,然后是单遍解决方案。
例
perm sort element/key A B C -> A B C -> A,B,C B C A -> A B C -> A,B,C
CALL SORTC 将对变量进行排序,但您不希望对实际变量进行排序,因此必须将值复制到将要排序(并从输出中删除)的其他变量中
CALL SORTC
一个 hash 可以将键值与combination_id相关联。每次遇到新的键值时,combo_id都会递增,或者当键已经存在时,它会被检索。
hash
例:
data HAVE; input ID VAR1 $ VAR2 $ VAR3 $; DATALINES; 001 A B C 002 A C B 003 B C A 004 A B . 005 B A . 006 D E F 007 E F D 008 F E D 009 E F . 010 F E . 011 C A B 012 E D F RUN; data want; if 0 then set have; * prep pdv; length _key $100 combo_id 8; * host variables for hash; if _n_ = 1 then do; declare hash ids(); ids.defineKey ('_key'); ids.defineData ('combo_id'); ids.defineDone(); end; set have; * copy data into variables that will be sorted; * combination of raw data; * use cats in case some of variables are numeric; _item1 = cats(var1); _item2 = cats(var2); _item3 = cats(var3); * alternative if combo_id is to be based on formatted data values; * use vvalue to obtained formatted representation of data values; * _item1 = vvalue(var1); * _item2 = vvalue(var2); * _item3 = vvalue(var3); array items _item1-_item3; * arrayify the _items so they can be sorted; call sortc(of items(*)); * delimit with hex 255, a character not likely to occur * in the data value or formatted representation; _key = catx('FF'x, of items(*)); * retrieve or increment the combo_id; if ids.find() ne 0 then do; combo_id = ids.num_items + 1; ids.add(); end; drop _:; run;