SAS不等行数据列合并:生成含Discount列的Data3表求助
实现代码方案
方法一:PROC SQL 分组拼接+左连接
逻辑直观,适合快速实现需求:
/* 第一步:从Data2筛选Source=Discount的数据,按policy和Risk分组拼接Item1 */ proc sql noprint; create table discount_temp as select policy, Risk, catx('*', Item1) as Discount from Data2 where Source = 'Discount' group by policy, Risk; /* 第二步:将拼接结果与Data1左连接,生成包含Discount列的Data3 */ create table Data3 as select a.*, b.Discount from Data1 as a left join discount_temp as b on a.policy = b.policy and a.Risk = b.Risk; quit;
代码说明
catx('*', Item1):自动忽略缺失值,用*拼接同组内所有Item1值LEFT JOIN:保证Data1的所有行都保留,未匹配到Discount的行,Discount列显示为缺失discount_temp为临时中间表,存储分组拼接后的结果,避免重复计算
方法二:DATA步哈希表匹配(适合大数据量场景)
数据集较大时,哈希表匹配效率更高,先预处理Data2再匹配:
/* 预处理Data2:筛选Discount数据并按分组字段排序 */ proc sort data=Data2(where=(Source='Discount')) out=Data2_discount; by policy Risk; run; /* 按policy+Risk分组拼接Item1 */ data discount_hash; length Discount $200; /* 根据Item1实际长度调整字符变量长度 */ retain Discount; set Data2_discount; by policy Risk; if first.Risk then Discount = Item1; else Discount = catx('*', Discount, Item1); if last.Risk then output; run; /* 用哈希表匹配Data1,生成Data3 */ data Data3; set Data1; if _n_ = 1 then do; declare hash h(dataset:'discount_hash'); h.defineKey('policy', 'Risk'); h.defineData('Discount'); h.defineDone(); call missing(Discount); end; rc = h.find(); drop rc; run;
代码说明
- 先筛选并排序Data2中符合条件的数据,确保同组的policy+Risk连续
- 用
RETAIN和BY组逻辑完成拼接,仅保留每个policy+Risk的最终拼接结果 - 哈希表加载预处理后的结果,遍历Data1每一行完成匹配,未匹配到的行Discount列保持缺失
注意事项
- 若Item1为数值型,需先转为字符型再拼接,例如用
put(Item1, best.)替换代码中的Item1 - 需根据实际拼接后内容的长度,调整
length Discount $200中的数值,避免内容截断
内容的提问来源于stack exchange,提问作者Sheri
相关产品推荐
相关产品推荐

