2015-10-14 84 views
1

我怎麼能生產出具有這種多個變量信息的表:SAS PROC頻率 - 每個類別的頻率爲多個變量

VARIABLE COUNT PERCENT 
U   51 94.4444 
Y   3 5.5556 

這是SAS吐出到所有變量的列表輸出當我運行此程序:

ods output nlevels=nlevels1 OneWayFreqs=freq1 ; 

proc freq data=sample nlevels ; 

    tables _character_/out=outfreq1; 

run; 

outfreq1表存在於數據集剛剛過去的變量(如上所示表),但不是所有的變量信息。 在nlevels1表中有關於每個變量有多少類別但沒有頻率數據的信息。

我想要的是輸出所有變量的頻率信息。 有沒有人知道一種沒有宏/循環的方法?

回答

1

你基本上有兩種選擇,它們在你遇到的問題種類上很相似:使用PROC TABULATE,這更自然地處理多個表格輸出,或者使用已經調用的onewayfreqs輸出對於。

這樣做的問題是,變量可能是不同的類型,所以它沒有一列包含所有這些信息 - 它有一對每個變量的列,顯然有點...亂。即使你的變量都是相同的類型,SAS不能認爲這是一般規則,所以它不會爲你產生一個好的整潔的東西。

儘管你可以做什麼,特別是如果你能夠使用格式化值(要麼因爲想要,要麼因爲它們是相同的!),將它們合併成一個結果。

例如,假設你從上面的數據集freq1

data freq1_out; 
    set freq1; 
    value = coalesce(of f_:); 
    keep table value frequency percent; 
run; 

,結合了F_變量爲一個變量(如永遠只有一個是不斷填充)。如果你不能使用F_變量並且需要原始變量,那麼你必須使用宏變量列表(或者其他一些方法,或者只是輸入全部名稱)來使用coalesce來創建自己的變量列表。

最後,你可以使用PROC SQL來產生一個相當類似的表,儘管我可能不會使用宏語言來做。 UNION ALL在這裏是一個方便的工具;基本上你必須爲每個變量單獨的子查詢與group by變量,所以

proc sql; 
    create table my_freqs as 
    select 'HEIGHT' as var, height, count(1) as count 
    from sashelp.class 
    group by 1,height 
    union all 
    select 'WEIGHT' as var, weight, count(1) as count 
    from sashelp.class 
    group by 1,weight 
    union all 
    select 'AGE' as var, age, count(1) as count 
    from sashelp.class 
    group by 1,age 
    ; 
quit; 

那當然可以平凡macrotized爲類似

proc sql; 
    create table my_freqs as 
    %freq(table=sashelp.class,var=height) 
    union all 
    %freq(table=sashelp.class,var=weight) 
    union all 
    %freq(table=sashelp.class,var=age) 
    ; 
quit; 

甚至進一步要麼與列表處理或宏循環。

+0

我的壞,喬,並不意味着要創建另一個「答案」。我將其刪除並標記爲最有用的答案。謝謝! – Mike