我有一个数据,我有各种类型的贷款说明,其中至少有100个。
我必须使用if和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,这会使其非常冗长和耗时
请帮忙!
答案 0 :(得分:1)
分类的另一个选择是使用格式。此示例使用手动语句,但如果您具有数据集中的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;
答案 1 :(得分:0)
对于像这样的映射练习,最好的方法是使用映射表。这样就可以在不改变代码的情况下更改映射,以及其他原因。
一个简单的例子如下所示:
/* 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;
此任务无需使用宏语言(我已相应更新了问题标签)。
答案 2 :(得分:0)
已经提出了很好的解决方案(我喜欢@ 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
的{{1}}表达式据我所知,这种方式不允许在单个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;