在SAS中评分大量变量的组合

时间:2018-01-18 13:36:15

标签: arrays sas

我遇到了尝试为一系列变量组合分配值的问题。

我现在写的代码如下:

if ai_hr_tat_flag = "Y" and ai_hr_flag = "N" and ai_wtp_flag = "N" and ai_prof_flag = "N" 
    then score= "4" ; 
else ai_hr_tat_flag = "Y" and ai_hr_flag = "Y" and ai_wtp_flag = "N" and ai_prof_flag = "N" 
    then score = "4" ; 
else ai_hr_tat_flag = "N" and ai_hr_flag = "Y" and ai_wtp_flag = "Y" and ai_prof_flag = "N" 
    then score = "4" ; 
else ai_hr_tat_flag = "" and ai_hr_flag = "Y" and ai_wtp_flag = "N" and ai_prof_flag = "Y" 
    then score = "5" ; 

代码肯定有效,但我面临的问题是实际上有10个变量,我必须对每个组合进行编码并给出所有分数。再一次,编码不是问题,但它效率不高,很难分辨你是否错过了一个组合。 我正在研究使用数组,但我只想说数组有点让我害怕。 如果有人能就如何获得一个整洁有效的解决方案提供任何帮助,我将非常感激。 谢谢你的阅读。

2 个答案:

答案 0 :(得分:1)

如果有这么大的评分要求,那么创建一个现有组合的查找表并添加一个得分列比硬编码if语句要好得多。

使用10个3值(Y / N /空白)变量,您需要3 ** 10(或59,049)个组合才能应对。我不想编码!

步骤1.获取实际组合

proc sql;
  create table score_lookup_table as
  select 
    ai_hr_tat_flag
  , ai_hr_falg
  , ai_wtp_flag
  , ai_prof_flag
  , ... the six other flags ...
  , count(*) as combination_count
  , 0 as score
  from have
  group by
  ai_hr_tat_flag
  , ai_hr_falg
  , ai_wtp_flag
  , ai_prof_flag
  , ... the six other flags ...
  ;

步骤2.编辑score_lookup_table

为查找表中的每一行输入分数值。您可以使用SAS表编辑器(视图表)。如果要进行大量复制并粘贴导出到Excel并在完成后重新导入。

步骤3.使用查找表

proc sort data=have out=want; by ...10 flag variables...;
proc sort data=score_lookup_table; by ...10 flag variables...;
data want;
  merge want score_lookup_table;
  by ...10 flag variables...;
run;

第4步。

检查want是否缺少分数。自上次更新分数查找以来,这些将是新的组合。

如果评分机制是基于规则的,则可能会有一个可以使用的评分算法。

答案 1 :(得分:0)

理查德是对的。查找表是明确的解决方案。如果由于某种原因,您坚持要对这些分数进行硬编码并寻找更易于阅读的语法,则可以使用select语句。

data have;
do ai_hr_tat_flag = 'Y','N',' ';
    do ai_hr_flag = 'Y','N',' ';
        do ai_wtp_flag = 'Y','N',' ';
            do ai_prof_flag = 'Y','N',' ';
                output;
            end;
        end;
    end;
end;
run;

data want;
set have;
select (ai_hr_tat_flag || ai_hr_flag || ai_wtp_flag || ai_prof_flag);
    when ('YNNN') score = '4';
    when ('YYNN') score = '4';
    when ('NYYN') score = '4';
    when (' YNY') score = '5';
    otherwise; /*this allows you checking if all combinations have been found. E.g. otherwise abort; terminates execution if a combination is missing*/
end;
run;