【问题标题】:SAS make summary statistic not available in proc meanSAS 使汇总统计在 proc mean 中不可用
【发布时间】:2017-08-04 21:54:44
【问题描述】:

我有一个包含很多列的表格,但是为了解释我的 问题我将使用这个简单的表格。

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;

这会产生下表:

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

但这并不能解决我的问题。

【问题讨论】:

  • 你熟悉 SQL 吗? SAS 有一个 PROC SQL,这将是解决这个问题的一种方法。如果您想坚持使用 PROC MEANS,您可以创建二进制变量 GreaterThan0GreaterThan2 并使用 PROC MEANS 对它们求和。
  • 我使用过 proc sql 但我看不出它如何解决我的问题。我只用它来计算总和、最大值和最小值。但我看不到如何计算大于 x 的列数。
  • 现在无法测试。你不能select min(a), max(a), sum(missing(a)), sum(a&gt;0)吗?
  • 不知道。我明天试试。

标签: sas summary


【解决方案1】:

如果您为每一行添加一个唯一标识符,那么您只需使用 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多