Grouping SAS:具有重叠值的多个列的唯一标识符
以下面包含人员及其会话的示例代码为例:Grouping SAS:具有重叠值的多个列的唯一标识符,grouping,nodes,combinations,permutation,uniqueidentifier,Grouping,Nodes,Combinations,Permutation,Uniqueidentifier,以下面包含人员及其会话的示例代码为例: data test; length pers session $5; input pers $ session $; datalines; a 1 a 2 a 7 b 2 b 3 c 3 d 4 e 5 h 2 ; run; 前6条记录和最后一条记录应具有相同的唯一标识符,因为会话2将人员A、B和H链接起来,会话3将
data test;
length pers session $5;
input pers $ session $;
datalines;
a 1
a 2
a 7
b 2
b 3
c 3
d 4
e 5
h 2
;
run;
前6条记录和最后一条记录应具有相同的唯一标识符,因为会话2将人员A、B和H链接起来,会话3将人员B(链接到人员A)链接到人员C
i、 e.所有7个记录都通过个人和/或会话进行链接。如果在节点结构中将person视为“父级”,将session视为“子级”,则所有链接的子级和父级应位于同一UID中。任何中断都应该是单独的UID
第7行和第8行(人员D和E)将有自己的唯一标识符,因为它们没有重叠的人员或会话。结果如下所示:
Person|Session|Unique_ID
a 1 UID1
a 2 UID1
a 7 UID1
b 2 UID1
b 3 UID1
c 3 UID1
h 2 UID1
d 4 UID2
e 5 UID3
我尝试过换位和多次保留,但逐行进行会变得很棘手,因为似乎你必须保留部分匹配,但如果有完整匹配,则返回分组。我可能想得太多了,但似乎很复杂
有人对我如何实现这一点有什么想法吗?我再次修改了代码,它应该适用于上述场景
proc sql;
create table test1 as
select x.*, flag from
(select * from test) x
left join
(select distinct a.cust, case when a.dev = b.dev
and a.cust ne b.cust then 1 end as flag from test a
inner join
test b
on a.dev = b.dev
and a.cust ne b.cust) y
on x.cust = y.cust;
proc sort data =test1;
by cust ;
run;
data test2;
set test1;
by cust;
retain _flag;
if flag = 1 then _flag = flag;
else if first.cust then _flag +1;
Unique_ID = cats("UID",_flag);
drop flag _flag ;
run;
数据集中有多少行?大多数情况下预计会发生什么?(客户+设备组合数量最多的合成组)如果您有SAS或,PROC BOM也是一个不错的选择。可能有数千行,可以将其视为可以访问相同设备(如计算机或智能手机)的家庭成员或个人分组(即,一个家庭中有3名客户使用总共4台设备)。永远不会有20个客户使用100台设备。不幸的是,我没有访问PROC BOM的权限--这看起来确实是一个不错的选择。这对原始示例有效,但在实际数据中无效,因此我可能应该添加更多变体。再次以上面的示例数据为例,其中现在有客户a和设备Ce 7.这正确分配UID1,但随后错误地为客户B和C重新分配UID。我已经修改了代码,现在设备可能在任何地方,如果设备在那里,则唯一id将不会增加。它已关闭,但仍然无法正常工作。如果您在客户H设备2的示例数据中添加一行(由于设备2,该行应链接到UID1),它最终得到了自己的UID3。我不确定你的意思。我的意思是,如果有任何匹配的设备可供任何客户使用。所有这些客户都被分组为1并获得UID1。否则,你要做的是为每个新客户添加+1,然后获得UID2、UID3等。