我有一个我从proc集群创建的树,我想为每个集群添加级别。
_NAME_ _PARENT_ lvl
CL1 1
CL2 CL1 2
CL3 CL2 3
CL4 CL1 2
CL5 CL4 3
CL6 CL3 4
CL7 CL5 4
CL8 CL6 5
CL9 CL6 5
在excel上,我只需做一个简单的VLookup,但我无法在SAS上做到这一点。
以下是我尝试过的代码:
data etude.tree;
set etude.tree;
drop Clef;
if _NAME_='CL1' then level=1;
run;
proc sql;
create table etude.tree2 as
select distinct a.*, b.level + 1 as level
from etude.tree a
left join etude.tree b
on a._PARENT_ = b._NAME_;
quit;
答案 0 :(得分:1)
您可以通过多种方式完成此操作。在简单的布局中,保证CL#的顺序递增,使用临时数组(或类似的哈希表)非常容易。
data tree;
input _NAME_ $ _PARENT_ $ lvl_fin;
datalines;
CL1 . 1
CL2 CL1 2
CL3 CL2 3
CL4 CL1 2
CL5 CL4 3
CL6 CL3 4
CL7 CL5 4
CL8 CL6 5
CL9 CL6 5
;;;;
run;
data tree_fin;
set tree;
array cl[999] _temporary_;
if missing(_parent_) then level=1;
else level = cl[input(compress(_parent_,,'kd'),8.0)]+1;
cl[input(compress(_name_,,'kd'),8.0)]=level;
run;
基本上你有一个CL数组,由CL编号索引,你查找父数据的值,然后存储本地的值。顺便说一句,临时数组会自动保留。只有在保证始终在“父”节点之后看到“后来的”节点时,这才有效;如果您在子节点之后可以看到父节点,则必须以不同的方式执行此操作,或者可能需要两次或多次传递,但整体概念类似。