В SAS, как объединить несколько строк в 1 по некоторому идентификатору - PullRequest
0 голосов
/ 03 мая 2018

У меня есть такая таблица

org_ID          linenr  text
811558672   10  Legevirksomhet.
811560782   10  Clavier Classics er et musikkselskap som produserer komposisjoner og
811560782   20  arrangementer av svært høy kvalitet. De kombinerer den klassiske
811560782   30  musikktradisjonen med moderne teknikker og deres kunder spenner fra
811560782   40  individuelle musikere til ensembler, festivalarrangører, konserthus,
811560782   50  kulturinstitusjoner, eventskapere og mediaprodusenter.
811560812   10  Grafisk design, illustrasjon og nærliggende virksomhet.
811561592   10  Sosial- og helsetjenesten. Konsulentvirksomhet: Veiledning til
811561592   20  foreldre, fosterhjem, skole og barnehage.

Как видите, для некоторых org_ID они появляются несколько раз, потому что им не хватает одной строки текста. Когда это происходит, белье показывает несколько номеров. Теперь я хочу объединить несколько строк текста в одну, когда org_ID одинаков. Как мне это сделать? Большое спасибо заранее.

Ответы [ 2 ]

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

Цикл DOW может накапливать каждую строку текста в группе org_ID в окончательный длинный текст. Длинному тексту должна быть назначена определенная длина, чтобы предотвратить усечения, которые могут произойти, если используются длины по умолчанию. Вы можете или не можете хотеть разделитель пробела между объединенными строками.

data want(keep=org_ID longtext);
  do until (last.org_ID);
    set have;
    by org_ID;
    length longtext $2000;
    longtext = catx(' ', longtext, text);
  end;
run;

Если данные не отсортированы, но строки org_ID являются смежными, вы можете использовать

    by org_ID notsorted;

Так что же происходит?

  • Longtext - это переменная, не относящаяся к набору данных, поэтому она автоматически сбрасывается на отсутствующую в верхней части шага данных.
  • Шаг данных повторяется для каждой строки в группе до последней строки в группе.
  • Длина переменной longtext указывается после оператора set, поэтому она будет последней переменной в векторе данных программы (pdv) и, таким образом, будет вторым столбцом сохраняемых переменных.
  • catx используется для накопления конкатенации текстовых данных внутри группы. Пробел используется для разделения частей текстовых данных.

Если вы не хотите использовать разделитель пространства, накапливайте, используя

    longtext = cats(longtext, text);
0 голосов
/ 03 мая 2018

Используйте функциональность SAS Retain для объединения текста и вывода только тогда, когда читается новый org_ID.

Примечание. Два оператора IF обрабатывают регистры первой строки и последней строки; где нет предыдущего идентификатора или следующего идентификатора.

Рабочий код: (Ваши входные данные должны быть отсортированы)

data have;
infile datalines dlm=',' dsd; 
length org_ID 8.  linenr 8. text $200.;
input org_ID linenr  text $;
datalines;
811558672,10, "Legevirksomhet."
811560782,10, "Clavier Classics er et musikkselskap som produserer komposisjoner og"
811560782,20, "arrangementer av svært høy kvalitet. De kombinerer den klassiske"
811560782,30, "musikktradisjonen med moderne teknikker og deres kunder spenner fra"
811560782,40, "individuelle musikere til ensembler, festivalarrangører, konserthus,"
811560782,50, "kulturinstitusjoner, eventskapere og mediaprodusenter."
811560812,10, "Grafisk design, illustrasjon og nærliggende virksomhet."
811561592,10, "Sosial- og helsetjenesten. Konsulentvirksomhet: Veiledning til"
811561592,20, "foreldre, fosterhjem, skole og barnehage."
;
run;

data want;
set have nobs=nobs;
retain longtext;
retain id;
if(_N_=1) then do; longtext=text; id=org_ID; end;
else if org_ID ne id then do; output; longtext=text; id=org_ID; end;
else longtext=cats(longtext,text);
if (_N_=nobs) then do; output; end;
keep org_ID longtext;
run;

Выход:

org_ID=811560782 longtext=Legevirksomhet.
org_ID=811560812 longtext=Clavier Classics er et musikkselskap som produserer komposisjoner ogarrangementer av svært høy kva
org_ID=811561592 longtext=Grafisk design, illustrasjon og nærliggende virksomhet.
org_ID=811561592 longtext=Sosial- og helsetjenesten. Konsulentvirksomhet: Veiledning tilforeldre, fosterhjem, skole og barneha
...