Краткий обзор

Мы живем в мире данных — небольших данных, больших данных и данных других всевозможных объемов между небольшими и большими данными. В современном мире мы постоянно сталкиваемся с данными. Мы постоянно говорим о данных, создаем данные, считываем данные, передаем данные, получаем данные и сохраняем данные. И нам все равно хочется и требуется еще больше данных. Поэтому мы получаем еще больше данных на работе, на совещаниях, дома, с помощью смартфонов, по электронной почте, в голосовых сообщениях, в финансовых отчетах, во время анализа прибыли и убытков, при просмотре потоковых видео, в компьютерных играх, при сравнении спортивных команд и любимых игроков и многими другими способами. Мы собираем все больше данных с поразительной скоростью в надежде лучше понять мир вокруг нас. Нам как профессионалам SAS® мир данных предлагает много новых и интересных возможностей. Но в то же время мы понимаем, что источники данных могут создавать множество проблем с целостностью данных, которые сначала нужно решить. В этой презентации описаны доступные методы удаления повторяющихся наблюдений (строк) из наборов данных (таблиц) на основе значений строки и/или ключа с использованием SAS®.

Введение

Проблема, с которой мы сталкиваемся в некоторых наборах данных — наличие повторяющихся наблюдений и/или повторяющихся ключей. При обнаружении любых повторяющихся наблюдений и/или повторяющихся ключей их можно удалить с помощью SAS.

Примечание: Прежде чем удалять дубликаты, обязательно обратитесь к аналитику данных организации или эксперту в этой области, чтобы узнать, можно и нужно ли удалять повторяющиеся данные. Лучше перестраховаться, чем потом сожалеть о сделанном. В этом документе демонстрируются три очень разных подхода к удалению повторяющихся наблюдений (строк) из наборов данных (таблиц) на основе значений строки и/или ключа с использованием SAS®. Каждый пример иллюстрируется с использованием одного и того же набора данных, MOVIES. Набор данных Movies содержит 26 наблюдений и состоит из шести столбцов. Столбцы Title, Category, Studio и Rating содержат символьные значения; столбцы Length и Year — числовые значения. Набор данных Movies содержит два повторяющихся наблюдения – Brave Heart и Rocky; и два повторяющихся ключа Title – Forrest Gump и The Wizard of Oz, как показано ниже.

Метод 1 – Удаление дубликатов с помощью PROC SORT

В первом методе, который популярен среди профессионалов SAS во всем мире, для удаления дубликатов используется процедура SORT. Процедура SORT поддерживает три параметра для удаления дубликатов: DUPOUT=, NODUPRECS и NODUPKEYS.

Указание параметра DUPOUT=

С помощью параметра DUPOUT= можно определить повторяющиеся наблюдения, не удаляя их из набора данных. Параметр DUPOUT= используется с одним из параметров NODUPKEYS или NODUPRECS для указания набора данных, содержащего повторяющиеся ключи или наблюдения. Параметр DUPOUT= обычно используется, когда набор данных слишком велик для визуального просмотра. В следующем примере кода используются параметры DUPOUT= и NODUPKEY. Результирующая таблица содержит повторяющиеся наблюдения: Brave Heart, Forrest Gump, Rocky и The Wizard of Oz.

Код PROC SORT

PROC SORT DATA=Movies

DUPOUT=Movies_Sorted_Dupout_NoDupkey NODUPKEY ;

BY Title ; RUN ;

Результирующая таблица

В следующем примере кода используются параметры DUPOUT= и NODUPRECS . Результирующая таблица содержит повторяющиеся наблюдения Brave Heart и Rocky, так как эти строки содержат одинаковые данные для всех столбцов.

Код PROC SORT

PROC SORT DATA=Movies

DUPOUT=Movies_Sorted_Dupout_NoDupRecs NODUPRECS ;

BY Title ; RUN ;

Результирующая таблица

Указание параметра NODUPRECS (или NODUP)

При использовании параметра NODUPRECS (или NODUPREC) (или NODUP) определяются наблюдения с одинаковыми значениями для всех столбцов, которые затем удаляются из набора данных. В результирующей таблице удалены повторяющиеся наблюдения Brave Heart и Rocky, так как они содержали одинаковые данные для всех столбцов.

Код PROC SORT

PROC SORT DATA=Movies

OUT=Movies_Sorted_without_DupRecs NODUPRECS ;

BY Title ; RUN ;

Результирующая таблица

Параметр NODUPKEYS (или NODUPKEY)

При указании параметра NODUPKEYS (или NODUPKEY) из результирующего набора данных автоматически удаляются наблюдения с повторяющимися ключами. В результирующем наборе данных удалены все повторяющиеся наблюдения для Brave Heart, Forrest Gump, Rocky и The Wizard of Oz, так как эти строки содержали повторяющиеся ключи в столбце Title.

Код PROC SORT

PROC SORT DATA=Movies

OUT=Movies_Sorted_without_DupKey NODUPKEYS ;

BY Title ; RUN ;

Примечание: Хотя удаление дубликатов с использованием PROC SORT популярно у многих пользователей SAS, при обработке наборов больших данных с использованием этого метода следует соблюдать осторожность. Операции сортировки занимают много времени и активно используют процессорные ресурсы и память. Чтобы избежать сортировки, специалисты по SAS часто используют процедуру PROC SUMMARY с инструкцией CLASS (см. метод 2).

Метод 2 – Удаление дубликатов с помощью PROC SQL

Во втором методе удаления дубликатов используется PROC SQL. PROC SQL представляет собой альтернативу PROC SORT, которая особенно эффективна для пользователей реляционных СУБД и организаций, которые активно пользуются SQL. Ниже будут продемонстрированы два подхода к удалению дубликатов. В каждом из них используется ключевое слово DISTINCT в инструкции SELECT.

Указание ключевого слова DISTINCT

Процедура PROC SQL с ключевым словом DISTINCT позволяет пользователям SAS эффективно удалять строки, в которых все столбцы содержат одинаковые значения. В следующем примере повторяющиеся строки удаляются с использованием ключевого слова DISTINCT.

Удаление дубликатов строк с помощью PROC SQL

proc sql ;

create table Movies_without_DupRows as select DISTINCT (Title),

Length, Category, Year, Studio,

Rating

from Movies_with_Dups order by Title ;

quit ;


Использование ключевого слова DISTINCT и инструкций GROUP BY и HAVING

С помощью ключевого слова DISTINCT и инструкций GROUP BY и HAVING можно удалить из таблицы строки с повторяющимися ключами. В результирующем наборе данных удалены все повторяющиеся наблюдения Brave Heart, Forrest Gump, Rocky и The Wizard of Oz, так как они содержали повторяющиеся ключи в столбце Title.

Код PROC SQL

proc sql ;

create table work.Movies_without_DupKey as

select DISTINCT(Title), Length, Category, Year, Studio, Rating from mydata.Movies_with_Dups

group by Title

having Title = MAX(Title) AND Length = MAX(Length) AND Category = MAX(Category) AND Year          =  MAX(Year) AND Studio = MAX(Studio) AND Rating = MAX(Rating) ;

quit;


Метод 3 – Удаление дубликатов с помощью PROC SUMMARY

В третьем методе используется PROC SUMMARY с инструкцией CLASS . Процедура PROC SUMMARY с инструкцией CLASS представляет собой эффективную альтернативу PROC SORT и другим методам, так как в ней не нужно выполнять предварительную сортировку. Без сортировки для определения дубликатов нужно гораздо меньше системных ресурсов. Кроме того, этот метод эффективен благодаря трем дополнительным аспектам: указанию параметра NWAY, который соответствует сочетанию всех переменных CLASS, указанию инструкции CLASS для группировки наблюдений с одинаковыми значениями столбцов, и созданию столбца _FREQ_, содержащего количество повторений. В следующем примере используется инструкция CLASS со всеми переменными для выбора наблюдений (строк) с повторяющимися вхождениями (дубликатов) во всей записи (наблюдении). Параметр OUTPUT OUT= выводит результат в выходной набор данных SAS.

Удаление строк с повторяющимися значениями переменных с помощью PROC SUMMARY

proc summary data=Movies_with_Dups

nway ;

class Title Length Category Year Studio Rating ; id Length Category Year Studio Rating ;

output out=Movies_Summary_without_DupRecs (drop=_type_) ;

run ;

proc print data=Movies_Summary_without_DupRecs

(rename=(_freq_ = Dupkey)) noobs ;

run ;

В следующем примере используется инструкция CLASS с переменной ключа для выбора наблюдений (строк) с повторяющимися вхождениями (дубликатов) только в самом ключе. Параметр OUTPUT OUT= выводит результат в выходной набор данных SAS.

Удаление строк с повторяющимися ключами с помощью PROC SUMMARY

proc summary data=Movies_with_Dups

nway ; class Title ;

id Length Category Year Studio Rating ; output out=Movies_Summary_without_DupKey

(drop=_type_) ;

run ;

proc print data=Movies_Summary_without_DupKey

(rename=(_freq_ = Dupkey)) noobs ;

run ;

Заключение

Многие пользователи используют процедуру PROC SORT для удаления повторяющихся наблюдений (строк) на основе ключа и/или всей записи из наборов данных SAS. В этой статье была продемонстрирована как эта процедура, так и два других подхода. Поскольку сортировка может быть затратной и трудоемкой, рекомендуется использовать методы со сниженным использованием системных ресурсов, такие как PROC SQL и PROC SUMMARY. Второй из описанных методов основан на использовании процедуры PROC SQL. Так как большая часть современных данных находится в базах данных, существует потребность в использовании универсального языка при удалении дубликатов. Последний метод с использованием процедуры PROC SUMMARY и инструкции CLASS является более эффективной альтернативой PROC SORT и PROC SQL, так как в нем не требуется предварительная сортировка.

Оригинал статьи на английском. Автор Kirk Paul Lafler.