我不会像 Alex A 所建议的那样创建单独的数据步骤。这可能是一个不好的习惯,因为对于大型数据集,它在 CPU 方面的成本可能非常高。
相反,我会将 Proc Means 调用子集化,但与 Alex A 的建议略有不同,因为您可能不希望从“by”语句生成的输出,因为“by”语句要求数据按“by”排序' 变量(另一个代价高昂的 CPU 错误要最小化):
proc means data=dat2(where=(country ne 'ITALY'))
median n mean q1 q3 noprint nway;
var NewVar;
output out=median1(drop=_:) n=n median=median mean=mean q1=q1 q3=q3;
run;
proc print data=median1;
run;
proc means data=dat2(where=(age>35)) n median mean q1 q3 noprint nway;
var DiffVar;
class sex;
output out=median2(drop=_:) n=n median=median mean=mean q1=q1 q3=q3;
run;
proc print data=median2;
run;
“noprint”选项禁止 SAS 将输出写入列表文件。
“nway”选项禁止包含为性别生成的自动 _ type_ 变量 - 类变量(正如 Alex A. 所指出的,SAS 将为每个请求的指标生成三个级别或 _ type_ 变量:2 表示性别和一个整体)。
'drop=_:' 语句会删除第一个字符中带有下划线的任何变量。对于 Proc Means,这将包括自动变量 _type_ 和 _freq_ 以及数据集中以下划线开头的任何其他变量。
在 Proc Means 调用中添加 'n' 选项可为您提供类变量的每个子集的频率,其中 _freq_ 变量仅为您提供非缺失信息的整体样本,并且不会按类的级别对其进行分解声明。
或者,您可以使用“where”语句将数据读入 Proc 均值调用。我不确定,但我的印象是使用“data=”调用对数据进行子集化在计算上更有效。我从通用 SAS 规则中推断出这一点,即尽可能避免可执行语句并将“if”、“where”和其他命令保持在 PDV(程序数据向量)级别:
proc means data=dat2 median n mean q1 q3 noprint nway;
var NewVar;
where country ne 'ITALY';
output out=median1(drop=_:) n=n median=median mean=mean q1=q1 q3=q3;
run;