Как мне написать 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;

лиц JimSusanHelen не в порядке сортировки, поэтому, если 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;
Другие вопросы по тегам