SAS-选择第一次出现唯一ID的行(ID可以在两列中)

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; 目标是获得一个列表,其中每

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;
目标是获得一个列表,其中每个客户都与一(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;