2016-12-02 72 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;