2016-12-02 50 views
2

Blockquote如何删除基于两个不同列的重复值?

For Ex。如果我在列A中有值“a”,则相同的值不应出现在列A和列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 

如果我尝试与结果如下提到的A柱NODUPKEY。但价值重复。

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

请让我知道。

+0

是(a b)(c d)(e f)也是您输入的有效结果集?如果不是,为什么不呢? – user667489

+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; 

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

+0

非常感谢! –

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; 

run;