sas - sas:如何为多个变量设置 if-then 语句
问题描述
假设我有一个由schoolID SAT_code
和组成的数据集student_name
。我要分类的是,对于那些schoolID
具有'ABC'
相同SAT_code
的'East'
. 而带有schoolID
with的那些'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 循环来解决这个问题?
谢谢。
解决方案
查找表
最好使用查找表来完成:
创建一个表,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;
推荐阅读
- c# - 如何使设置页面影响多个表单?
- visual-studio-code - VS 代码不会灰显未使用的变量
- python - 为什么我的 Pyinstaller exe 在启动 Java 程序的线路上的其他计算机上失败?
- typescript - TypeScript 未在 CMD 中编译
- angular - Angular 7:数据显示在页面上,但控制台具有无法读取属性
- php - 扩展公共静态属性
- codeigniter - Ci会话cookie复制到不同的浏览器
- html - 如何在多个内部制作元素
一个 即使在宽度?(角度) - python - 将文件中的行放入多个变量中会产生奇怪的不一致
- c# - 如何为 HttpClient 调用配置网络跟踪 Dotnet 核心?