(SAS) Удаление дубликатов во время объединения - PullRequest
0 голосов
/ 13 сентября 2018

Я использую следующий шаг данных для объединения значений нескольких наблюдений в одну переменную:

data Data_PreFinal;
set work.reasons;
by Number;
length Changes $4000.;
retain Changes;
if first.Number then Changes = EndoReason;
else Changes = catx(', ', Changes, EndoReason);
if last.Number then output;
run;

Например, я хотел бы убедиться, что если набор данных Причины выглядит следующим образом:

Number    EndoReason
1         Bucket1
1         Bucket2
1         Bucket1
1         Bucket3
1         Bucket2
1         Bucket2
2         Bucket2
2         Bucket2
2         Bucket1
2         Bucket2

что результирующий набор данных Data_PreFinal выглядит следующим образом:

Number    EndoReason
1         Bucket1, Bucket2, Bucket3
2         Bucket2, Bucket1

вместо перечисления всех повторяющихся значений в переменной EndoReason.

Любая помощь будет в значительной степениоценил!

Спасибо!

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

Просто выполните поиск в текущей строке Changes для значения конкретной строки и объедините его, только если он еще не существует.Используется только функция index, и я также немного изменил ваш код, чтобы использовать call catx вместо catx (я думаю, что в этих ситуациях это лучше).

data reasons;
input Number EndoReason $;
datalines;
1         Bucket1
1         Bucket2
1         Bucket1
1         Bucket3
1         Bucket2
1         Bucket2
2         Bucket2
2         Bucket2
2         Bucket1
2         Bucket2
;
run;

data Data_PreFinal;
set work.reasons;
by Number;
length Changes $4000.;
retain Changes;
if first.Number then call missing(Changes);
if not index(Changes,trim(EndoReason)) then call catx(', ', Changes, EndoReason);
if last.Number then output;
run;
0 голосов
/ 13 сентября 2018

Друг !, возможно, сначала было бы полезно удалить дубликаты наблюдений. Например:

data reasons;
    input Number EndoReason : $30.;
    datalines;
1         Bucket1
1         Bucket2
1         Bucket1
1         Bucket3
1         Bucket2
1         Bucket2
2         Bucket2
2         Bucket2
2         Bucket1
2         Bucket2
;

*Only eliminate duplicates;
proc sort data=reasons out=reasons_nodup nodup;
    by Number EndoReason;
run;

data Data_PreFinal;
    set work.reasons_nodup;
    by Number;
    length Changes $4000.;
    retain Changes;
    if first.Number then Changes = EndoReason;
    else Changes = catx(', ', Changes, EndoReason);
    if last.Number then output;

    drop EndoReason;
    rename Changes = EndoReason;
run;

Удачи!

...