具有条件的数据中特定变量的SAS统计参数
SAS statistic parameters of specific variables from data with conditions
我有一个基于特定数据创建的变量。现在在这个新数据中我需要计算不同的统计参数,但有条件
例如:
*这个新变量的中值仅用于观察他们的出生国不是意大利。
*仅当年龄>35 时,不同变量的平均值,
*Q1 和 Q3 的 2 种类型相同的变量(例如女性和男性)
等等。
我应该使用 PROC FREQ 还是 PROC MEANS——因为它包括所有这些统计数据?无论哪种方式,这对我来说都不起作用..我怎样才能在来自数据的单个变量上改进这个过程?
proc means data=dat2;
where "birth_country" NE Italy";
run;
proc means data dat2;
where Mage>=35;
run;
您可以在输入数据集中将不需要的值设置为缺失值,因为缺失值会被 proc means
忽略。然后您可以在单个 var
语句中使用所有需要的变量。
假设你要汇总的变量叫var1
和var2
,你可以这样做:
data input;
set dat2;
if birth_country = "Italy" then call missing(var1);
if age <= 35 then call missing(var2);
run;
proc means data = input mean median q1 q3;
class sex;
var var1 var2;
run;
使用 class sex;
将为您提供按性别和总体分类的结果。
如果这看起来太难理解,您可以将其分解为对 proc means
.
的多次调用
proc means data = dat2 mean median q1 q3;
class sex;
var var1;
where birth_country ^= "Italy";
run;
proc means data = dat2 mean median q1 q3;
class sex;
var var2;
where age > 35;
run;
有关 proc means
中可用的各种语句和选项的更多具体细节,请查看 SAS documentation for that procedure。
我不会按照 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_ 变量 -- class 变量(正如 Alex A. 指出的那样,SAS 会生成三个级别或 _type_ 变量对于每个请求的指标:2 个用于性别,1 个用于总体)。
'drop=_:' 语句去除第一个字符带有下划线的任何变量。对于 Proc Means,这将包括自动变量 _ type_ 和 _ freq_ 以及数据集中以下划线开头的任何其他变量。
将 'n' 选项添加到 Proc Means 调用可为您提供 class 变量的每个子集的频率,其中 _ freq_ 变量仅提供非缺失信息的整体样本,而不会按 class 语句的级别将其分解。
或者,您可以使用 'where' 语句将数据读入 Proc Means 调用。我不确定,但我的印象是使用 'data=' 调用对数据进行子集化计算效率更高。我是从关于避免可执行语句并尽可能将 'if,' 'where' 和其他命令保持在 PDV(程序数据向量)级别的一般 SAS 规则中推断出来的:
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;
我有一个基于特定数据创建的变量。现在在这个新数据中我需要计算不同的统计参数,但有条件 例如: *这个新变量的中值仅用于观察他们的出生国不是意大利。 *仅当年龄>35 时,不同变量的平均值, *Q1 和 Q3 的 2 种类型相同的变量(例如女性和男性) 等等。 我应该使用 PROC FREQ 还是 PROC MEANS——因为它包括所有这些统计数据?无论哪种方式,这对我来说都不起作用..我怎样才能在来自数据的单个变量上改进这个过程?
proc means data=dat2;
where "birth_country" NE Italy";
run;
proc means data dat2;
where Mage>=35;
run;
您可以在输入数据集中将不需要的值设置为缺失值,因为缺失值会被 proc means
忽略。然后您可以在单个 var
语句中使用所有需要的变量。
假设你要汇总的变量叫var1
和var2
,你可以这样做:
data input;
set dat2;
if birth_country = "Italy" then call missing(var1);
if age <= 35 then call missing(var2);
run;
proc means data = input mean median q1 q3;
class sex;
var var1 var2;
run;
使用 class sex;
将为您提供按性别和总体分类的结果。
如果这看起来太难理解,您可以将其分解为对 proc means
.
proc means data = dat2 mean median q1 q3;
class sex;
var var1;
where birth_country ^= "Italy";
run;
proc means data = dat2 mean median q1 q3;
class sex;
var var2;
where age > 35;
run;
有关 proc means
中可用的各种语句和选项的更多具体细节,请查看 SAS documentation for that procedure。
我不会按照 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_ 变量 -- class 变量(正如 Alex A. 指出的那样,SAS 会生成三个级别或 _type_ 变量对于每个请求的指标:2 个用于性别,1 个用于总体)。
'drop=_:' 语句去除第一个字符带有下划线的任何变量。对于 Proc Means,这将包括自动变量 _ type_ 和 _ freq_ 以及数据集中以下划线开头的任何其他变量。
将 'n' 选项添加到 Proc Means 调用可为您提供 class 变量的每个子集的频率,其中 _ freq_ 变量仅提供非缺失信息的整体样本,而不会按 class 语句的级别将其分解。
或者,您可以使用 'where' 语句将数据读入 Proc Means 调用。我不确定,但我的印象是使用 'data=' 调用对数据进行子集化计算效率更高。我是从关于避免可执行语句并尽可能将 'if,' 'where' 和其他命令保持在 PDV(程序数据向量)级别的一般 SAS 规则中推断出来的:
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;