SAS 使汇总统计在 proc mean 中不可用
SAS make summary statistic not available in proc mean
我有一个 table 有很多列但是为了解释我的
问题我将使用这个简单的 table.
data test;
input a b c;
datalines;
0 0 0
1 1 1
. 4 2
;
run;
我需要计算最小值、最大值和缺失数的通用汇总统计量。但我还需要计算一些特殊数字作为高于某个级别的值的数量(在本例中 >0 和 >1。
我可以使用 proc mean,但它只会给我正常情况下的结果,例如最小值、最大值等。
我想要的是以下格式的结果:
var minval maxval nmiss n_above1 n_above2
a 0 1 1 1 0
b 0 4 0 2 1
c 0 2 0 2 1
我已经能够用这个为一个变量制作这个信息而不是
愚蠢的代码:
data result;
set test(keep =b) end=last;
variable = 'b';
retain minval maxval;
if _n_ = 1 then do;
minval = 1e50;
maxval = -1e50;
end;
if minval > b then minval = b;
if maxval < b then maxval = b;
if b=. then nmiss+1;
if b>0 then n_above1+1;
if b>2 then n_above2+1;
if last then do;
output;
end;
drop b;
run;
这会产生以下结果 table:
variable minval maxval nmiss n_above1 n_above2
b 0 4 0 2 1
我知道必须有更好的方法来做到这一点。我习惯了Python和Pandas。在那里我只会遍历每个变量,计算不同的汇总统计数据并将结果附加到每个变量的新数据框中。
我可能也可以使用 proc sql。下一个例子
proc sql;
create table res as
select count(case when a > 0 then 1 end) as n_above1_a,
count(case when b > 0 then 1 end) as n_above1_b,
count(case when c > 0 then 1 end) as n_above1_c
from test;
quit;
这给了我:
n_above1_a n_above1_b n_above1_c
1 2 2
但这并不能解决我的问题。
如果您为每一行添加一个唯一标识符,那么您只需使用 PROC TRANSPOSE 和 PROC SQL 即可获得结果。
data test;
input a b c;
id+1;
datalines;
0 0 0
1 1 1
. 4 2
;
proc transpose data=test out=tall ;
by id ;
run;
proc sql noprint ;
create table want as
select _name_
, min(col1) as minval
, max(col1) as maxval
, sum(missing(col1)) as nmiss
, sum(col1>1) as n_above1
, sum(col1>2) as n_above2
from tall
group by _name_
;
quit;
结果
Obs _NAME_ minval maxval nmiss n_above1 n_above2
1 a 0 1 1 0 0
2 b 0 4 0 1 1
3 c 0 2 0 1 0
我有一个 table 有很多列但是为了解释我的 问题我将使用这个简单的 table.
data test;
input a b c;
datalines;
0 0 0
1 1 1
. 4 2
;
run;
我需要计算最小值、最大值和缺失数的通用汇总统计量。但我还需要计算一些特殊数字作为高于某个级别的值的数量(在本例中 >0 和 >1。
我可以使用 proc mean,但它只会给我正常情况下的结果,例如最小值、最大值等。
我想要的是以下格式的结果:
var minval maxval nmiss n_above1 n_above2
a 0 1 1 1 0
b 0 4 0 2 1
c 0 2 0 2 1
我已经能够用这个为一个变量制作这个信息而不是 愚蠢的代码:
data result;
set test(keep =b) end=last;
variable = 'b';
retain minval maxval;
if _n_ = 1 then do;
minval = 1e50;
maxval = -1e50;
end;
if minval > b then minval = b;
if maxval < b then maxval = b;
if b=. then nmiss+1;
if b>0 then n_above1+1;
if b>2 then n_above2+1;
if last then do;
output;
end;
drop b;
run;
这会产生以下结果 table:
variable minval maxval nmiss n_above1 n_above2
b 0 4 0 2 1
我知道必须有更好的方法来做到这一点。我习惯了Python和Pandas。在那里我只会遍历每个变量,计算不同的汇总统计数据并将结果附加到每个变量的新数据框中。
我可能也可以使用 proc sql。下一个例子
proc sql;
create table res as
select count(case when a > 0 then 1 end) as n_above1_a,
count(case when b > 0 then 1 end) as n_above1_b,
count(case when c > 0 then 1 end) as n_above1_c
from test;
quit;
这给了我:
n_above1_a n_above1_b n_above1_c
1 2 2
但这并不能解决我的问题。
如果您为每一行添加一个唯一标识符,那么您只需使用 PROC TRANSPOSE 和 PROC SQL 即可获得结果。
data test;
input a b c;
id+1;
datalines;
0 0 0
1 1 1
. 4 2
;
proc transpose data=test out=tall ;
by id ;
run;
proc sql noprint ;
create table want as
select _name_
, min(col1) as minval
, max(col1) as maxval
, sum(missing(col1)) as nmiss
, sum(col1>1) as n_above1
, sum(col1>2) as n_above2
from tall
group by _name_
;
quit;
结果
Obs _NAME_ minval maxval nmiss n_above1 n_above2
1 a 0 1 1 0 0
2 b 0 4 0 1 1
3 c 0 2 0 1 0