说我有一个包含schoolID SAT_code
和student_name
的数据集。我要分类的是,那些schoolID
与'ABC'
的{{1}}与SAT_code
相同。而那些'East'
与schoolID
的人将与'XYZ'
的{{1}}相同。
对于这样的数据集:
SAT_code
除此之外,还有超过30个schoolID。
我能想到的最简单但臭名昭著的方法是使用if-then 30次。
'Midwest'
有没有更有效的方法,可能有某种for循环来解决此问题?
谢谢。
答案 0 :(得分:2)
最好使用查找表来完成此操作:
使用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
中没有相应的schoolsat
值,则SAS将在结果表中为SAT_code
保留缺失值。
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映射移动到另一个数据结构。