使用 SAS 或 Excel 删除 "almost duplicates"

Removing "almost duplicates" using SAS or Excel

我在 SAS 工作,我有一个包含 2 列的数据集,我不仅要删除重复项,还要删除 "almost" 重复项。数据如下所示:

**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

我不知道这是否真的可行,但我希望文件在删除 "duplicates" 后看起来像这样:

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

如果最后 table 会有,我没有偏好。 "Pepsi Zero" 或 "Pepsi Zro" 只要没有 "duplicate" 个值。

我在想是否有办法比较例如前 4-5 个字母,如果它们相同则认为它们是重复的。但我当然愿意接受建议。如果即使在 excel 也有办法完成,我很想听听。

我将直接引用 Jeff 的 answer :

SAS has at least a couple functions for calculating edit distance between two strings:

Compged, for general edit distance: http://support.sas.com/documentation/cdl/en/lrdict/64316/HTML/default/viewer.htm#a002206133.htm

Complev, for Levenshtein distance: http://support.sas.com/documentation/cdl/en/lrdict/64316/HTML/default/viewer.htm#a002206137.htm

还有spedis()比较编辑距离的功能。

现在这些都很棒,但我个人最喜欢的是 soundex() 函数,它可以让您测试两个单词 'sound' 是否相同。它不会是 100% 正确的,但在这种情况下,结果正常。

首先是一些数据:

Data HAVE;
  attrib name length= alt_name length=;
  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;

现在我将把它留作对结果列表进行重复数据删除的练习。但基本上这会告诉你哪些词匹配。如果您得到匹配项的误报,只需将它们添加到例外列表以手动转换这些特定值。