[英]Automating IF and then statement in sas using macro in SAS
我有一个数据,其中有各种类型的贷款说明,其中至少有100个。
我必须使用if and then函数将它们归类为各种存储桶。 请查看数据以供参考
data des;
set desc;
if loan_desc in ('home_loan','auto_loan')then product_summary ='Loan';
if loan_desc in ('Multi') then product_summary='Multi options';
run;
为了说明,我仅针对两个贷款说明进行了显示,但是我需要将大约1000个不同的loan_descr归类到不同的存储桶中。
如何将这些贷款描述分类到不同的存储桶中,而又无需在代码中一遍又一遍地写产品摘要和loan_desc,这使它非常冗长且耗时
请帮忙!
进行分类的另一种方法是使用格式。 本示例使用手动语句,但是如果数据集中有to / from值,则还可以从数据集中创建格式。 如@Tom所示,这允许您仅更改表,并且代码保持不变以备将来更改。
关于您当前代码的一个注释,您使用的是If / Then而不是If / ElseIf。 您应该使用If / ElseIf,因为一旦满足一个条件,它将立即终止,而不是通过所有选项运行。
proc format;
value $ loan_fmt
'home_loan', 'auto_loan' = 'Loan'
'Multi' = 'Multi options';
run;
data want;
set have;
loan_desc = put(loan, $loan_fmt.);
run;
对于这样的映射练习,最好的技术是使用映射表。 这样,除了其他原因外,无需更改代码即可更改映射。
下面是一个简单的示例:
/* create test data */
data desc (drop=x);
do x=1 to 3;
loan_desc='home_loan'; output;
loan_desc='auto_loan'; output;
loan_desc='Multi'; output;
loan_desc=''; output;
end;
data map;
loan_desc='home_loan'; product_summary ='Loan '; output;
loan_desc='auto_loan'; product_summary ='Loan'; output;
loan_desc='Multi'; product_summary='Multi options'; output;
run;
/* perform join */
proc sql;
create table des as
select a.*
,coalescec(b.product_summary,'UNMAPPED') as product_summary
from desc a
left join map b
on a.loan_desc=b.loan_desc;
无需为此任务使用宏语言(我已相应更新了问号)。
已经提出了很好的解决方案(我喜欢@Reeza的proc format
解决方案),但是这是另一条可以最大程度减少编码的方法。
data have;
loan_desc="home_loan"; output;
loan_desc="auto_loan"; output;
loan_desc="Multi"; output;
loan_desc=""; output;
run;
PROC SQL
的case
表达式 据我所知,这种方式不允许在单个when
行上使用多个条件,但是由于结果变量的名称只需要写下一次,因此它确实简化了编码。
proc sql;
create table want as
select
loan_desc,
case loan_desc
when "home_loan" then "Loan"
when "auto_loan" then "Loan"
when "Multi" then "Multi options"
else "Unknown"
end as product_summary
from have;
quit;
否则,也可以使用以下语法,得到相同的结果:
proc sql;
create table want as
select
loan_desc,
case
when loan_desc in ("home_loan", "auto_loan") then "Loan"
when loan_desc = "Multi" then "Multi options"
else "Unknown"
end as product_summary
from have;
quit;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.