在SAS中如何按指定ID将多行数据合并为一行?附示例表
嘿,这问题我熟!要在SAS里按org_ID把多行文本合并成一行,核心是按ID分组,再按linenr的顺序拼接文本,给你两种实用的方法:
方法1:DATA步(最直观,可控性强)
这种方法适合需要精细控制拼接逻辑的场景,步骤清晰易懂:
- 先对数据集按
org_ID和linenr排序,确保文本是按顺序拼接的; - 用
BY组和RETAIN语句保留跨观测的拼接结果; - 只输出每个
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
相关产品推荐
相关产品推荐

