7

我是 SAS 的初学者,我有以下问题。

我需要从一个数据集中计算几个变量 (ABC) 的计数和百分比,并将结果保存到另一个数据集中。我的代码是:

过程频率数据=我的数据;表 ABC / out=data_out ; 跑;

每个变量的过程结果出现在 SAS 输出窗口中,但 data_out 仅包含最后一个变量的结果。如何将它们全部保存在 data_out 中?任何帮助表示赞赏。

4

5 回答 5

5

ODS OUTPUT是你的答案。您不能直接使用 输出OUT=,但可以像这样输出它们:

ods output OneWayFreqs=freqs;
proc freq data=sashelp.class;
  tables age height weight;
run;
ods output close;

OneWayFreqs 是单向表,(n>1) 向表是 CrossTabFreqs:

ods output CrossTabFreqs=freqs;
ods trace on;
proc freq data=sashelp.class;
  tables age*height*weight;
run;
ods output close;

ods trace on;您可以通过运行然后运行您的初始过程来找出正确的名称(到屏幕上);它会告诉你日志中输出的名称。(ods trace off;当你看腻了。)

于 2015-01-16T21:42:11.660 回答
1

在这里学习很多好的基本 sas 东西

1) 使用不同的输出数据集名称运行三个 proc freq 语句(每个变量 abc 一个),这样数据集就不会被覆盖。

2) 在 out = 语句上使用重命名选项来更改合并数据集时的计数和百分比变量

3)按类别排序并将所有数据集合并在一起

(我假设多个变量中出现了一些值,如果没有,你可以只堆叠数据集)

data mydata;
    input a $ b $ c$;
    datalines;
r r g
g r b
b b r
r r r
g g b
b r r
;
run;

proc freq noprint data = mydata; 
    tables a / out = data_a 
    (rename = (a = category count = count_a percent = percent_a)); 
run;
proc freq noprint data = mydata; 
    tables b / out = data_b 
    (rename = (b = category count = count_b percent = percent_b)); 
run;
proc freq noprint data = mydata; 
    tables c / out = data_c 
    (rename = (c = category count = count_c percent = percent_c)); 
run;

proc sort data = data_a; by category; run;
proc sort data = data_b; by category; run;
proc sort data = data_c; by category; run;

data data_out;
    merge data_a data_b data_c;
    by category;
run;
于 2015-01-16T22:21:49.653 回答
0

这是我处理过很多次的问题,我希望 SAS 有更好的方法来解决这个问题。

我的解决方案是一个泛化的宏,提供您的输入数据、变量列表和输出数据集的名称。我考虑了你必须做的变量的格式/类型/标签

希望能帮助到你:

https://gist.github.com/statgeek/c099e294e2a8c8b5580a

/* 描述:创建一个包含百分比/计数的变量的单向频率表 参数:dsetin - inputdataset varlist - 要分析的变量列表,以空格分隔 dsetout - 要创建的数据集的名称

作者:F.Khurshed 日期:2011 年 11 月

*/

%macro one_way_summary(dsetin, varlist, dsetout);

proc datasets nodetails nolist;
    delete &dsetout;
quit;

*loop through variable list;
%let i=1;
%do %while (%scan(&varlist, &i, " ") ^=%str());
%let var=%scan(&varlist, &i, " ");  

%put &i &var; 

    *Cross tab;
    proc freq data=&dsetin noprint;
    table &var/ out=temp1;
    run;

    *Get variable label as name;
    data _null_;
        set &dsetin (obs=1);
        call symput('var_name', vlabel(&var.));
    run;
    %put &var_name;

    *Add in Variable name and store the levels as a text field;
    data temp2;
        keep variable value count percent;
        Variable = "&var_name";
        set temp1;
        value=input(&var, $50.);
        percent=percent/100; * I like to store these as decimals instead of numbers;
        format percent percent8.1;
        drop &var.;
    run;

    %put &var_name;
    *Append datasets;
    proc append data=temp2 base=&dsetout force;
    run;

    /*drop temp tables so theres no accidents*/
    proc datasets nodetails nolist;
        delete temp1 temp2;
    quit;

*Increment counter;
%let i=%eval(&i+1);
%end;

%mend;

%one_way_summary(sashelp.class, sex age, summary1);

proc report data=summary1 nowd;
    column variable value count percent;
    define variable/ order 'Variable';
    define value / format=$8. 'Value';
    define count/'N';
    define percent/'Percentage %';
run;
于 2015-01-16T22:42:07.340 回答
0

与以往一样,在 SAS 中有很多不同的方法来做这种事情。以下是其他几个选项:

1. 使用 proc summary 而不是 proc freq:

proc summary data = sashelp.class;
    class age height weight;
    ways 1;
    output out = freqs;
run;

2.在一个单一的使用多个表语句proc freq

这比运行 3 个单独的 proc freq 语句更有效,因为 SAS 只需读取输入数据集一次而不是 3 次:

proc freq data = sashelp.class noprint;
    table age       /out = freq_age;
    table height    /out = freq_height;
    table weight    /out = freq_weight;
run;

data freqs;
    informat age height weight count percent;
    set freq_age freq_height freq_weight;
run;
于 2015-01-17T11:19:21.633 回答
0

在 9.3 中添加到 PROC MEANS 的选项 STACKODS(OUTPUT) 使这项任务变得更加简单。

proc means data=have n nmiss stackods;
  ods output summary=want;
run;

| Variable | N     | NMiss |
| ------   | ----- | ----- |
|        a |     4 |     3 |
|        b |     7 |     0 |
|        c |     6 |     1 |
于 2017-03-08T19:10:00.350 回答