SAS-选择第一次出现唯一ID的行(ID可以在两列中)
I已计算出客户(ID_a和ID_b)之间的距离(var1)。Var2和var3包含一些其他变量。数据按ID_a和var1排序(因此最接近的距离排在第一位) 现在我希望保留第一次出现ID的行;它是否在列ID_a或列ID_b中。输出应如下所示:SAS-选择第一次出现唯一ID的行(ID可以在两列中),sas,Sas,I已计算出客户(ID_a和ID_b)之间的距离(var1)。Var2和var3包含一些其他变量。数据按ID_a和var1排序(因此最接近的距离排在第一位) 现在我希望保留第一次出现ID的行;它是否在列ID_a或列ID_b中。输出应如下所示: data want; input (ID_a ID_b var1 var2 var3)($); cards; A B 12 xxx yyy C D 17 xxx yyy G K 32 xxx yyy run; 目标是获得一个列表,其中每
data want;
input (ID_a ID_b var1 var2 var3)($);
cards;
A B 12 xxx yyy
C D 17 xxx yyy
G K 32 xxx yyy
run;
目标是获得一个列表,其中每个客户都与一(1)个其他客户配对,并且距离尽可能近。当然有多种可能的组合,因为A可以最接近B,同时C也可以最接近(甚至更接近)B。如果可能,最好得到总距离最小的组合。以ID_a的升序排列组合
这样做的最佳解决方案是什么?我一直在用NODUPKEY检查PROC SORT,但这不是解决方案,因为每一行都是唯一的组合
我正在考虑使用宏来选择每个ID_a的每一行,如果该ID已经在ID_a或ID_b中使用过,则继续执行ID_a的第二行。然而,我找不到这样的代码的任何例子,我不确定这是最好的解决方案。因此,任何关于解决方案或代码的建议都很好。谢谢 根据评论,我建议按距离对数据进行排序,并选择出现的包含唯一对项目的第一对 例如:
散列
对于跟踪所选项目非常有效
proc sort data=have;
by var1 id_a;
data want;
length id $8;
if _n_ = 1 then do;
declare hash items();
items.defineKey('id');
items.defineDone();
call missing(id);
end;
set have;
if items.check(key:id_a) ne 0 and items.check(key:id_b) ne 0 then do;
output;
items.add(key:id_a, data:id_a);
items.add(key:id_b, data:id_b);
end;
drop id;
run;
您将在这里使用多大的数据集?当前数据集约2600行,ID_a中有216个唯一ID。因此,输出应该是108行。您还应该包括您在这里尝试过的内容,或者至少包括如果您不知道如何实现它,您通常会如何解决问题-这应该是“我不知道如何执行X,已经尝试过Y”而不是“为我编写执行X的代码”。并且:您说“首先”,您有定义排序顺序的变量吗?或者它只是“数据集中的顺序”(这并不理想)?当
C
第一次出现时,为什么不保留A C
?和cd
何时第一次出现D
和df
何时第一次出现?当G
第一次出现,然后gk
新鲜时,gb
如何。
proc sort data=have;
by var1 id_a;
data want;
length id $8;
if _n_ = 1 then do;
declare hash items();
items.defineKey('id');
items.defineDone();
call missing(id);
end;
set have;
if items.check(key:id_a) ne 0 and items.check(key:id_b) ne 0 then do;
output;
items.add(key:id_a, data:id_a);
items.add(key:id_b, data:id_b);
end;
drop id;
run;