如何根据两个不同的列删除重复值?

时间:2016-12-02 09:21:34

标签: sas

块引用

对于Ex。如果我在COLUMN A中有值“a”,则相同的值不应出现在COLUMN A和COLUMN B中。现在使用“a”时,也会为该观察选择值“c”。现在我们需要确保“c”不应出现在表格的任何位置。下面是一个示例数据集。

Col A   Col B
a   c
a   b
a   a
b   d
b   b
b   a
c   c
c   d
c   a
d   g
e   f

在上述情况下,结果集应仅包含

Col A   Col B
a   c
b   d
e   f

如果我尝试使用NODUPKEY和A列,结果如下所述。但价值观正在重复。

Col A   Col B
a   c
b   d
c   c
d   g
e   f

请告诉我。

2 个答案:

答案 0 :(得分:0)

这是一种方法,使用哈希对象来跟踪在处理数据集时到目前为止在任一列中看到的值:

data have;
input (A B) ($);
cards;
a   c
a   b
a   a
b   d
b   b
b   a
c   c
c   d
c   a
d   g
e   f
;
run;

data want;
set have;
if _n_ = 1 then do;
  declare hash h();
  rc = h.definekey('a');
  rc = h.definedone();
end;
if h.add(KEY:a,DATA:a)=0 then if h.add(KEY:b,DATA:b)=0 then output;
drop rc;
run;

这是一种贪婪的方法 - 在某些情况下,可能会有一个有效的输出数据集,其中有更多的行可以从您的输入数据集中生成,但它应该在大多数时间内完成合理的工作。

答案 1 :(得分:0)

哈希表是解决此问题的最佳方法。这是数组:

data want;
    set have;
    array temp [50]$ _temporary_; ;
    array var A--B;
    retain temp j;
    if _n_=1 then do;
       output;
       j=1;
       do i=1 to dim(var);
          temp(j)=var(i);
          j+1;
       end;
    end;
    else do;
       do i=1 to dim(var);
          if whichc(var(i), of temp(*))>0 then return;
       end;
       output;
       do i=1 to dim(var);
          temp(j)=var(i);
          j+1;
       end;
    end;
    drop i j;

运行;