sas:如何为多个变量设置if-then语句

时间:2018-10-02 03:11:45

标签: sas

说我有一个包含schoolID SAT_codestudent_name的数据集。我要分类的是,那些schoolID'ABC'的{​​{1}}与SAT_code相同。而那些'East'schoolID的人将与'XYZ'的{​​{1}}相同。

对于这样的数据集:

SAT_code

除此之外,还有超过30个schoolID。

我能想到的最简单但臭名昭著的方法是使用if-then 30次。

'Midwest'

有没有更有效的方法,可能有某种for循环来解决此问题?

谢谢。

2 个答案:

答案 0 :(得分:2)

查询表

最好使用查找表来完成此操作:

使用schoolIDSAT_code创建一个表,然后与源表执行合并:

data schoolsat;
  infile datalines delimiter=',';
  input schoolID $3 SAT_code $25;
  datalines;
ABC,East
XYZ,Midwest
MNO,East
;
run;

这将创建一个表,该表将schoolID值映射到SAT_code值。将所有必需的组合添加到此表中。

完成此操作后,在SAS世界中有两种合并数据的方法。这两个都是“ LEFT JOIN”的示例,无论上面创建的新statestats映射表中是否存在对应的行,它们都会保留schoolsat表中的所有记录。如果schoolID中没有相应的schoolsat值,则SAS将在结果表中为SAT_code保留缺失值。

SQL

proc sql;
  create table stateSAT as
  select a.*,
  b.SAT_code
  from statestats a
  left join schoolsat b
  on a.schoolID = b.schoolID;
quit;

数据步骤

proc sort data=schoolsat;
  by schoolID;
run;

proc sort data=statestats;
  by schoolID;
run;

data stateSAT;
  merge statestats (in=a)
        schoolsat;
  by schoolID;
  if a;
run;

答案 1 :(得分:1)

使用if/then语句可以更清楚地说明SELECT语句的长序列。它类似于SQL CASE或C switch

length SAT_code $20;

select (schoolID);
  when ("ABC") SAT_code = 'East';
  when ("XYZ") SAT_code = 'Midwest';
  when ("MNO") SAT_code = 'East';
  …
  otherwise SAT_code = '???';
end;

但是,使用30多个schoolID,最好遵循@mjsqu建议将这些schoolID映射移动到另一个数据结构。