Программирование SAS - удаление дубликатов - PullRequest
0 голосов
/ 08 мая 2018

У меня есть следующие данные, основанные на расстоянии между городами.

Source Destination Distance 
USA       UK        1000 
USA      Spain      200 
UK        USA       1000 
Germany  Spain      500 
Spain     USA       200 

Я хочу удалить дубликаты, если источник и пункт назначения совпадают. Например, USA до UK будет таким же, как UK до USA , и, следовательно, дублирующее значение необходимо удалить.

Ниже приводится желаемый результат.

Source Destination Distance 
USA        UK        1000 
USA      Spain       200 
Germany  Spain       500 

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Сначала создайте фиктивную переменную для хранения отсортированного источника и назначения с помощью вызова sortc, а затем сортируйте по фиктивной переменной.

data have;
input Source $ Destination $ Distance;
cards;
USA       UK        1000 
USA      Spain      200 
UK        USA       1000 
Germany  Spain      500 
Spain     USA       200 
;

data temp;
    set have;
    length dummy $50.;
    _var1=source; _var2=destination;
    call sortc (of _:);
    dummy=catx(' ',of _:);
    drop _:;
run;

proc sort data=temp out=want(drop=dummy) nodupkey;
by dummy;
run;
0 голосов
/ 08 мая 2018

Вам нужно будет создать таблицу измерений / поиска для всех требуемых маршрутов, а затем выполнить поиск значений, чтобы стандартизировать желаемый результат.

Я создал таблицу поиска с именем Routes и переменную, содержащую все значения пары для поиска.

Полный код:

data have;
input Source $ Destination $ Distance ;
datalines;
USA       UK        1000
USA      Spain      200
UK        USA       1000
Germany  Spain      500
Spain     USA       200
;
run;
data routes;
infile datalines dsd dlm=',';
length pairs $50.;
input Source $ Destination $ Distance Pairs $ ;
datalines;
USA,UK,1000,USA-UK/UK-USA
USA,Spain,200,USA-Spain/Spain-USA
Germany, Spain,500,Germany-Spain/Spain-Germany
;
run;

proc sql;
create table want as
     Select distinct 
     t2.Source, t2.Destination,  t2.Distance
     from have  t1 inner join routes t2 on
      t2.Pairs contains catx('-',t1.Source,t1.Destination) or 
      t2.Pairs contains catx('-',t1.Destination,t1.Source)
;
quit;

Выход:

 Source=Germany Destination=Spain Distance=500 
 Source=USA Destination=Spain Distance=200 
 Source=USA Destination=UK Distance=1000
...