2015-01-16 3 views
3

Я новичок в SAS, и у меня есть следующая проблема.Сохранение результатов из SAS proc freq с несколькими таблицами

Мне нужно вычислить подсчеты и проценты нескольких переменных (A B C) из одного набора данных и сохранить результаты в другом наборе данных. мой код:

proc freq data = mydata; таблицы A B C/out = data_out; бег;

результат процедуры для каждой переменной появляется в окне вывода SAS, но data_out содержит результаты только для последней переменной. Как сохранить их все в data_out? Любая помощь приветствуется.

ответ

2

ODS OUTPUT - ваш ответ. Вы не можете выводиться непосредственно с помощью OUT=, но вы можете вывести их следующим образом:

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

OneWayFreqs является односторонним, таблицы (п> 1) -WAY таблицы 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;, когда вы устали от его просмотра.)

+0

При запуске вашего первого примера я получаю предупреждение при сохранении всех трех переменных таблицы в одном и том же выходном наборе данных при использовании этого подхода. Я думаю, что резюме резюме здесь лучше, согласно моему ответу. – user667489

0

Много хорошей основной с.а.с вещи, чтобы узнать здесь

1) Выполнить три заявления FREQ Proc (по одному для каждой переменной 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; 
+0

Что делать, если переменные являются комбинацией числового/символьного? Или применяются форматы? – Reeza

0

Это вопрос, который я имел дело с много раз, и я ЖЕЛАЮ SAS был лучшим способом сделать это ,

Мое решение - это макрос, который обобщен, предоставляет ваши входные данные, список переменных и имя вашего выходного набора данных. Я принимаю во внимание формата/типа/метка переменной, которая бы сделать

Надеются, что это помогает:

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

/* Описание: Создает таблицу Односторонний Freq переменных в том числе процентов/ рассчитывать параметры: dsetin - inputdataset списке переменных - список переменных, которые будут проанализированы, разделенных пробелами dsetout - имя набора данных, созданного

Автор: Ф.Хуршед Дата: ноябрь 2011

*/

%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; 
0

Как всегда, есть много различных способов сделать такого рода вещи в SAS. Вот несколько других вариантов:

1. Используйте резюме прока, а не 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; 
0

опция STACKODS (выход) добавлена ​​к PR OC MEANS в 9.3 делает это гораздо более простой задачей.

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

| Variable | N  | NMiss | 
| ------ | ----- | ----- | 
|  a |  4 |  3 | 
|  b |  7 |  0 | 
|  c |  6 |  1 | 
+0

Я должен был также указать, что это только для числовых переменных – FriedEgg

Смежные вопросы