Как мне написать Do-Loop, который создает график для каждого уникального человека?
Я пытаюсь выполнить большой набор данных и создать простой график разброса для каждого человека. Я хотел бы запустить это в SAS, используя цикл do и proc sgplot.
Мой набор данных следующий:
Person Date QTY Brand
Jim | August 2015 | 20 | Pepsi
Jim | AUgust 2015 | 20 | Coke
Jim | October 2016 | 30 | Pepsi
Jim | November 2016 | 40 | Sprit
Susan | Sept. 2015 | 20 | Dr.Pepper
Susan | Dec. 2016 | 10 | Sprit
Helen | Jan. 2016 | 20 | Coke
Helen | Feb.2016 | 30 | Pepsi
Есть много разных людей (n=100). Я хочу создать точечную диаграмму для каждого уникального человека, которая показывает дату на оси х и количество на оси у. Тогда мне бы хотелось, чтобы баллы сгруппировались по марке.
В настоящее время мой код:
%do i =1 to count(distinct(Person));
proc sgplot data= Original (where=(count = 4))
scatter x=Date y=QTY/ group = Brand;
run;
end;
Какие-либо предложения?
3 ответа
В SAS выполнение чего-либо для каждой концепции обычно осуществляется через BY
заявление. Proc выполнит ожидаемые вами операции и автоматически обработает данные по группам в соответствии с различными значениями переменной by!
Этот пример демонстрирует, как by
Значение переменной можно поместить в заголовок графика (#byval1
), а также подавление подписи по умолчанию (nobyline
) который показал бы person = name как подзаголовок. BY PERSON
утверждение с необязательным аргументом NOTSORTED
означает, что строки группы будут сформированы построчно смежными значениями, что позволяет by
обработка работает без ошибок, даже если данные не отсортированы по Person
, Для более безопасной работы предварительно сортируйте или индексируйте данные, заданные переменными by.
data have; infile datalines dlm='|';
input
Person $ Date: date11. QTY Brand $;
format date date9.;
datalines;
Jim | 01-Aug-2015 | 20 | Pepsi
Jim | 01-Aug-2015 | 20 | Coke
Jim | 01-Oct-2016 | 30 | Pepsi
Jim | 01-Nov-2016 | 40 | Sprit
Susan | 01-Sep-2015 | 20 | Dr.Pepper
Susan | 01-Dec-2016 | 10 | Sprit
Helen | 01-Jan-2016 | 20 | Coke
Helen | 01-Feb-2016 | 30 | Pepsi
run;
title "Scatter for #BYVAL1";
options nobyline;
proc sgplot data=have;
by person notsorted;
scatter x=date y=qty / group = brand;
xaxis interval=month;
format date monyy7.;
run;
options byline;
title;
лиц Jim
Susan
Helen
не в порядке сортировки, поэтому, если NOTSORTED
опция была опущена, будет сообщение об ошибке и, возможно, какой-то неполный вывод.
Чтобы использовать цикл таким образом, вам нужно написать код внутри макроса. Также, чтобы получить список разных людей, вы можете использовать proc sql's select в: feature.
%macro CreatePlots;
proc sql noprint;
select disinct person into: people separated by ' '
from original;
quit;
/* List of people in macro variable */
%put &people;
/* Loop over the list of people */
%do i=1 %to %sysfunc(countw(&people));
%let person = %scan(&people,&i);
/* Print the current person being plotted */
%put &=person;
proc sgplot data= Original(where=(person="&person"));
scatter x=Date y=QTY/ group = Brand;
run;
%end;
%mend;
%CreatePlots;
Вы не добавляете оператор BY. Возможно, вам придется отсортировать данные заранее, PERSON, чтобы это работало, но процесс группы BY эффективен.
proc sgplot data= Original (where=(count = 4));
BY PERSON;
scatter x=Date y=QTY/ group = Brand;
run;