2015-03-31 2 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 

У меня нет предпочтения, если у конечной таблицы будет, например, «Pepsi Zero» или «Pepsi Zro», если нет «повторяющихся» значений.

Я думал, есть ли способ сравнить, например, первые 4-5 букв, и если они совпадают, то рассматривать их как дубликаты. Но, конечно, я открыт для предложений. Если есть способ сделать даже в excel, мне было бы интересно его услышать.

+0

Примечание: в этом процессе существует целый поле, и это очень сложно сделать эффективно. – Joe

ответ

4

Я собираюсь начать прямо со ссылкой на Джефф answer:

SAS имеет по крайней мере пару функций для вычисления расстояния редактирования между двумя строками:

Compged, для общего расстояния редактирования: http://support.sas.com/documentation/cdl/en/lrdict/64316/HTML/default/viewer.htm#a002206133.htm

Complev, для расстояния Левенштейна: 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() с для Eyeballing:

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, поскольку он выполняет перекрестное соединение (также известное как декартовое соединение продукта) и может производить много данных. Возможно, вам лучше получить отдельный список продуктов, а затем выполнить перекрестное объединение. –

+0

Метод не-sql для этого - это в основном создать новую переменную, которая фактически хранит SOUNDEX, а затем сортирует ее. Тогда вы можете свернуть его в datastep довольно точно так же, как SQL, за исключением без декартова продукта. Я бы отметил, что на самом деле это не очень хорошо работает, но что вы можете сделать. – Joe

+0

@RobertPenridge благодарим вас за ваш ответ. Это было очень интересно, так как я не знал ни одной из функций, которые вы упомянули, и я также мог использовать метод SQL, потому что мои данные были не такими большими.Небольшой вопрос, хотя в отношении функции 'soundex()'. При использовании для сравнения, например, 'Coca Cola Light' и' Coca Cola Lgt' значения для этих 2 были чем-то вроде 'A1233582247' и' A12335822'. Таким образом, было невозможно сравнить значения значений 'soundex()' и сказать, например. если '-5

Смежные вопросы