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

SAS如何按ID分组合并多条var1值至all_names变量?

解决方案

要实现同一ID下所有var1条目合并,需要利用SAS的retain语句跨观测保留累积的字符串,结合first.ID和last.ID控制变量初始化与输出时机,以下提供两种常用场景的代码:

场景1:每个ID仅输出一行,包含合并后的所有名称

data want;
  set test;
  by ID;
  length all_names $ 200; /* 根据实际需求调整变量长度,避免截断 */
  retain all_names; /* 保留变量值,跨观测传递 */
  
  if first.ID then do;
    all_names = var1; /* 该ID的第一个观测,初始化合并字符串 */
  end;
  else do;
    all_names = catx(', ', all_names, var1); /* 后续观测追加新名称,catx自动处理分隔符 */
  end;
  
  if last.ID then output; /* 仅在每个ID的最后一行输出合并结果 */
  keep ID all_names; /* 保留需要的变量 */
run;

场景2:原数据每行都显示对应ID的完整合并名称

如果需要保留原数据的所有行,同时每行都显示该ID的全部合并名称,可以先通过汇总得到每个ID的合并值,再合并回原数据集:

/* 第一步:生成每个ID的合并名称汇总表 */
proc sql;
  create table id_all_names as
  select ID, catx(', ', collect(set(var1))) as all_names length=200
  from test
  group by ID;
quit;

/* 第二步:合并回原数据集 */
data want;
  merge test id_all_names;
  by ID;
run;

关键说明

  • retain语句:让变量在跨观测时保留上一个观测的值,是实现累积合并的核心。
  • catx函数:相比cat更适合字符串合并,它会自动忽略空值,且不会在字符串开头或结尾添加多余的分隔符。
  • first.ID/last.ID:通过BY分组后自动生成的标识变量,分别标记每个ID的第一个和最后一个观测,用于初始化和输出控制。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 19:05:31