在 SAS 中,如何通过某个 ID 将多行连接成 1

In SAS, how to concatenate multiple rows into 1 by some ID

我有一个table这样的

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,它们出现了多次,因为一行文本对它们来说不够。发生这种情况时,linenr 会显示多个数字。现在我想在 org_ID 相同时将多行文本连接成一行。我该怎么做?非常感谢。

使用 SAS Retain 功能连接文本并仅在读取新 org_ID 时输出。

注意:两个IF语句分别处理第一行和最后一行的情况;没有 Previous ID 或 Next ID 的地方。

工作代码:(您的输入数据必须排序)

data have;
infile datalines dlm=',' dsd; 
length org_ID 8.  linenr 8. text 0.;
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

DOW 循环可以将 org_ID 组中的每一行文本累积成最终的长文本。应为长文本分配特定长度,以防止使用默认长度时可能发生的截断。您可能希望也可能不希望在连接的行之间使用 space 分隔符。

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

如果数据没有排序,但是org_ID行是连续的,可以使用

    by org_ID notsorted;

所以发生了什么?

  • Longtext 是一个非数据集变量,因此在数据步骤的顶部自动重置为缺失。
  • 数据步骤对组中的每一行进行迭代,直到组中的最后一行。
  • 变量longtext的长度在set语句之后指定,因此它是程序数据向量(pdv)中的最后一个变量,因此是保留变量的第二列。
  • catx 用于累积组内文本数据的串联。 space 用于分隔文本数据部分。

如果您不需要 space 分隔符,请使用

进行累加
    longtext = cats(longtext, text);