我正在 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
我不偏好决赛 table 是否有例如“Pepsi Zero”或“Pepsi Zro”,只要没有“重复”值即可。
我在想是否有一种方法可以比较例如前 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()
函数,它允许您测试两个单词“听起来”是否相同。它不会 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()
:
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;
现在我将把它留作练习,以对结果列表进行重复数据删除。但基本上这会告诉你哪些词是匹配的。如果匹配出现误报,只需将它们添加到异常(exception)列表中即可手动转换这些特定值。
关于excel - 使用 SAS 或 Excel 删除 "almost duplicates",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29373148/