2017-08-04 97 views
0

我有一個很多列的表,但爲了解釋我的 問題,我將使用這個簡單的表。SAS做彙總統計不可用proc的意思

data test; 
    input a b c; 
    datalines; 
    0 0 0 
    1 1 1 
    . 4 2 
    ;   
run; 

我需要計算公共摘要統計作爲最小值,最大值和缺失數。但我還需要計算一些特殊數字作爲高於一定水平的值的數量(在本例中> 0和> 1)。

我可以使用proc平均值,但它只給出正常情況下的結果,如min,max等。

我要的是下列格式結果:

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 

但是,這並沒有解決我的問題。

+0

你熟悉SQL? SAS有一個PROC SQL,這將是解決這個問題的一種方法。如果你想堅持使用PROC MEANS,你可以使用二進制變量'GreaterThan0'和'GreaterThan2'並使用PROC MEANS來求和它們。 – Quentin

+0

我已經使用PROC SQL,但我看不出如何解決我的問題。我只用它來計算總和,最大值和最小值。但我不明白我將如何計算大於x的列。 – fossekall

+0

現在無法測試。難道你不能'選擇min(a),max(a),sum(missing(a)),sum(a> 0)'? – Quentin

回答

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 
+0

這是一個非常聰明的解決方案! – fossekall