我遇到了尝试为一系列变量组合分配值的问题。
我现在写的代码如下:
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个变量,我必须对每个组合进行编码并给出所有分数。再一次,编码不是问题,但它效率不高,很难分辨你是否错过了一个组合。 我正在研究使用数组,但我只想说数组有点让我害怕。 如果有人能就如何获得一个整洁有效的解决方案提供任何帮助,我将非常感激。 谢谢你的阅读。
答案 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;