繁体   English   中英

自动执行IF,然后在SAS中使用SAS中的宏进行语句

[英]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 SQLcase表达式

据我所知,这种方式不允许在单个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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM