显示"级别"在proc集群的树输出中

时间:2014-05-30 09:36:10

标签: sql tree sas

我有一个我从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;

1 个答案:

答案 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编号索引,你查找父数据的值,然后存储本地的值。顺便说一句,临时数组会自动保留。只有在保证始终在“父”节点之后看到“后来的”节点时,这才有效;如果您在子节点之后可以看到父节点,则必须以不同的方式执行此操作,或者可能需要两次或多次传递,但整体概念类似。