You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在SAS中如何按指定ID将多行数据合并为一行?附示例表

嘿,这问题我熟!要在SAS里按org_ID把多行文本合并成一行,核心是按ID分组,再按linenr的顺序拼接文本,给你两种实用的方法:

方法1:DATA步(最直观,可控性强)

这种方法适合需要精细控制拼接逻辑的场景,步骤清晰易懂:

  1. 先对数据集按org_ID和linenr排序,确保文本是按顺序拼接的;
  2. 用BY组和RETAIN语句保留跨观测的拼接结果;
  3. 只输出每个org_ID的最后一条观测(也就是拼接完成的最终结果)。

代码示例(假设你的原始数据集叫have,输出数据集叫want):

/* 第一步:排序,保证linenr的顺序正确 */
proc sort data=have;
    by org_ID linenr;
run;

/* 第二步:合并多行文本 */
data want;
    set have;
    by org_ID;
    /* 用RETAIN让combined_text变量的值在观测间保留 */
    retain combined_text;
    
    /* 每个org_ID的第一条观测:初始化拼接变量 */
    if first.org_ID then do;
        combined_text = text;
    end;
    /* 后续观测:把当前text追加到拼接变量后,CATX自动加空格分隔,不需要分隔符就换CAT */
    else do;
        combined_text = catx(' ', combined_text, text);
    end;
    
    /* 只保留每个org_ID的最后一条观测(拼接完成的结果) */
    if last.org_ID then output;
    /* 只保留需要的变量 */
    keep org_ID combined_text;
run;

方法2:PROC SQL + 自定义聚合(适合简洁写法)

如果你习惯SQL风格,SAS 9.4M6及以上版本支持STRING_AGG函数,可以直接分组拼接:

proc sql;
    create table want as
        select org_ID,
               string_agg(text, ' ' order by linenr) as combined_text
        from have
        group by org_ID;
quit;

⚠️ 注意:STRING_AGG需要SAS版本足够新,如果你的版本不支持,还是用DATA步更稳妥。

小提示

  • 如果不需要空格分隔文本,把catx(' ', ...)换成cat(combined_text, text),或者把STRING_AGG的分隔符改成'';
  • 如果文本里有特殊字符(比如换行、制表符),可以先用COMPRESS函数预处理后再拼接。

内容的提问来源于stack exchange,提问作者user8330379

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:38:22