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