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
相关产品推荐
相关产品推荐

