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

SAS数据步中按分组拼接合并字符串的实现方法求助

解决SAS中按分组拼接字符变量的需求

嘿,这个把同一first值对应的second字段拼接成逗号分隔字符串的需求,在SAS里有两种非常实用的实现方式,我给你详细拆解下:

方法一:使用PROC SQL的STRING_AGG函数(SAS 9.4M5及以上版本)

如果你用的是较新的SAS版本,STRING_AGG函数可以直接帮你完成分组拼接,代码简洁到飞起:

首先先创建你的测试数据集:

data have;
    input first second $3.;
    cards;
1 A
1 B
1 C
1 D
2 E
2 F
3 S
3 A
4 C
5 Y
6 II
6 UU
6 OO
6 N
7 G
7 H
;
run;

然后用PROC SQL生成目标数据集:

proc sql;
    create table want as
        select first,
               string_agg(second, ',') as second separated by ','
        from have
        group by first
        order by first;
quit;

说明:

  • STRING_AGG(second, ',') 会把每个first组下的second值用逗号连接
  • group by first 指定按first分组聚合
  • 如果你的数据里有缺失值,可以加上ignore nulls参数:string_agg(second, ',' ignore nulls)

方法二:数据步实现(兼容所有SAS版本)

如果你的SAS版本比较旧,不支持STRING_AGG,用数据步结合BY语句和RETAIN也能轻松搞定:

data want;
    length concat_second $200; /* 根据实际需求调整长度 */
    retain concat_second;
    set have;
    by first;
    
    if first.first then do;
        concat_second = second;
    end;
    else do;
        concat_second = catx(',', concat_second, second);
    end;
    
    if last.first then do;
        second = concat_second;
        output;
    end;
    drop concat_second;
run;

说明:

  • length concat_second $200; 提前定义拼接变量的长度,避免截断,长度根据你的实际数据调整
  • retain concat_second; 让变量在数据步迭代中保留上一行的值
  • by first; 按first分组,first.first表示组内第一个观测,last.first表示组内最后一个观测
  • 组内第一个观测直接把second赋值给拼接变量,后续观测用catx(自动忽略缺失值)拼接
  • 只在组的最后一个观测输出结果,保证每个first只对应一行

关于输出的引号

你给出的示例输出里second字段带引号,其实SAS数据集里的字符变量本身不会包含引号,这只是显示格式。如果需要输出时显示引号,可以在拼接的时候加上,比如把concat_second = second;改成concat_second = quote(second);,或者用put语句输出时指定格式。

内容的提问来源于stack exchange,提问作者DIY-DS

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:52:25