2015-03-31 29 views
4

我在SAS工作,我有一個數據集與2列,我不僅要刪除重複,但也「幾乎」重複。數據是這樣的:刪除使用SAS或Excel「幾乎重複」

**Brand  Product** 
Coca Cola Coca Cola Light 
Coca Cola Coca Cola Lgt 
Coca Cola Cocacolalight 
Coca Cola Coca Cola Vanila 
    Pepsi  Pepsi Zero 
    Pepsi  Pepsi Zro 

我不知道它實際上是可能的,但我想這個文件,看起來像刪除「複製」後,就是這樣:

**Brand  Product** 
    Coca Cola Coca Cola Light 
    Coca Cola Coca Cola Vanila 
     Pepsi  Pepsi Zero 

如果決賽桌有例如,我沒有偏好只要沒有「重複」值,「百事可樂」或「百事可樂」。

我在想是否有辦法比較前4-5個字母,如果它們相同,則認爲它們是重複的。但我當然樂於接受建議。如果在excel中有一種方法可以完成,我會很樂意聽到它。

+0

注意:圍繞這類過程有一個完整的領域,要做到這一點非常困難。 – Joe 2015-03-31 17:35:59

回答

4

我要去直線上升引述開始傑夫的answer

SAS具有計算兩個字符串之間的編輯距離 至少幾個功能:

Compged,對於一般的編輯距離: http://support.sas.com/documentation/cdl/en/lrdict/64316/HTML/default/viewer.htm#a002206133.htm

Complev,對於Levenshtein距離: http://support.sas.com/documentation/cdl/en/lrdict/64316/HTML/default/viewer.htm#a002206137.htm

還有spedis()函數用於比較編輯距離。

現在,這些都是偉大的,但我個人最喜歡的是soundex()函數,它可以讓你測試兩個單詞'聲音'是否相同。這不會是100%正確的,但在這種情況下,結果工作正常。

首先是一些數據:

Data HAVE; 
    attrib name length=$20 alt_name length=$20; 
    infile datalines dsd dlm=',' truncover; 
    input name $ alt_name $; 
    datalines; 
Coca Cola ,Coca Cola Light 
Coca Cola ,Coca Cola Lgt 
Coca Cola ,Cocacolalight 
Coca Cola ,Coca Cola Vanila 
Pepsi  ,Pepsi Zero 
Pepsi  ,Pepsi Zro 
; 
Run; 

得到我們想要比較單詞的每個組合,並計算soundex() S代表目測:

proc sql noprint; 
    create table cartesian as 
    select a.name, 
     a.alt_name as alt_name1, 
     b.alt_name as alt_name2, 
     soundex(a.alt_name) as soundex_a, 
     soundex(b.alt_name) as soundex_b 
    from have a, have b 
    where a.name = b.name 
    and soundex(a.alt_name) eq soundex(b.alt_name) 
    ; 
quit; 

現在,我會離開它使用作爲練習來剔除結果列表。但基本上這會告訴你哪些詞匹配。如果您對比賽獲得誤判,只需將它們添加到例外列表中手動轉換這些特定值即可。

+0

我還應該補充一點,如果你有很多數據,你可能會希望在執行一個交叉連接(也稱爲笛卡爾產品連接)時注意這條SQL語句,並且可以產生大量的數據。你可能會更好地獲得不同的產品清單,然後再進行交叉連接。 – 2015-03-31 16:33:13

+0

非sql方法基本上是爲了創建一個實際存儲SOUNDEX的新變量,然後按此排序。然後,除了沒有笛卡爾積之外,您可以使用與SQL類似的方式在datastep中摺疊它。我會注意到,這並不是很好,但你可以做什麼。 – Joe 2015-03-31 17:35:34

+0

@RobertPenr​​idge非常感謝你的回答。這是非常有趣的,因爲我不知道你提到的任何函數,而且我也能夠使用SQL方法,因爲我的數據不是那麼大。雖然關於'soundex()'函數的一個小問題。當用於比較例如「可口可樂光」和「可口可樂Lgt」這兩款產品的價值就像是「A1233582247」和「A12335822」。所以不可能比較'soundex()'值的值並且例如如果'-5 2015-04-07 11:37:43