首页 > 解决方案 > sas:如何为多个变量设置 if-then 语句

问题描述

假设我有一个由schoolID SAT_code和组成的数据集student_name。我要分类的是,对于那些schoolID具有'ABC'相同SAT_code'East'. 而带有schoolIDwith的那些'XYZ'将具有相同SAT_code'Midwest'

对于这样的数据集:

schoolID    SAT_code    student_name
ABC                     Jasmine Smith
ABC                     Michael Jordan
ABC                     Madison Trump
XYZ                     Sarah Potter
XYZ                     Jim Fowler
XYZ                     Jack Black
 .                          .
 .                          .
 .                          .

除此之外还有30多个schoolID。

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

data stateSAT;
 set statestats;
 if schoolID eq 'ABC' then SAT_code 'East';
 else if schoolID eq 'XYZ' then SAT_code 'Midwest';
 else if schoolID eq 'MNO' then SAT_code 'East';
         and so forth.....
 run;

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

谢谢。

标签: sas

解决方案


查找表

最好使用查找表来完成:

创建一个表,schoolID然后SAT_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值,SAS 将在结果表中schoolsat留下一个缺失值。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;

推荐阅读