【问题标题】:Removing "almost duplicates" using SAS or Excel使用 SAS 或 Excel 删除“几乎重复的”
【发布时间】:2015-03-31 16:01:50
【问题描述】:

我在 SAS 工作,我有一个包含 2 列的数据集,我不仅想删除重复项,还想删除“几乎”重复项。数据如下所示:

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

如果决赛桌有例如,我没有偏好。 “Pepsi Zero”或“Pepsi Zro”,只要没有“重复”值即可。

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

【问题讨论】:

  • 注:这种过程涉及到一个完整的领域,而且很难有效地进行。

标签: excel sas


【解决方案1】:

我将直接引用 Jeff 的 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;

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

【讨论】:

  • 我还应该补充一点,如果您有大量数据,您可能需要小心该 SQL 语句,因为它正在执行交叉连接(也称为笛卡尔积连接)并且可以产生大量数据。您最好先获取不同的产品列表,然后再进行交叉连接。
  • 这个的非sql方法基本上是创建一个实际存储SOUNDEX的新变量,然后按那个排序。然后你可以在数据步中折叠它,与 SQL 非常相似,除了没有笛卡尔积。我会注意到这并不是真的那么好,但是你能做什么。
  • @RobertPenr​​idge 非常感谢您的回答。这很有趣,因为我不知道你提到的任何函数,而且我还能够使用 SQL 方法,因为我的数据并不大。关于soundex() 函数的一个小问题。当用于比较时,例如Coca Cola LightCoca Cola Lgt 这两个值类似于 A1233582247A12335822。因此无法比较 soundex() 值的值并说例如if -5<soundex(a) - soundex(b)<5 then delete(保持相差5个“单位”的值)
  • 嗯,我不认为我会使用这样的逻辑,因为我认为这些数字是通过连接分配给每个语音的数字来创建的。在这种情况下,数字末尾有一个额外的声音,这样逻辑就可以工作,但如果差异在开头,它就不起作用了。更好的选择可能是将编辑距离函数之一与 soundex 函数结合使用。 IE。如果 soundex 相同或编辑距离小于 x。
猜你喜欢
  • 1970-01-01
  • 2011-06-01
  • 1970-01-01
  • 2019-01-21
  • 1970-01-01
  • 2021-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多