Как мне написать Do-Loop, который создает график для каждого уникального человека? - PullRequest
1 голос
/ 08 мая 2019

Я пытаюсь просмотреть большой набор данных и создать простой график рассеяния для каждого человека.Я хотел бы запустить это в 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 ]

3 голосов
/ 08 мая 2019

В SAS , выполняющий что-либо для каждой концепции , обычно обслуживается с помощью оператора BY.Proc выполнит ожидаемые вами операции и автоматически обработает данные по группам в соответствии с различными значениями переменной by (s)!

Этот пример демонстрирует, как значение переменной 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;

people Jim Susan Helen не в порядке сортировки, поэтому, если опция NOTSORTED была оставленаможет появиться сообщение об ошибке и, возможно, какой-то неполный вывод.

1 голос
/ 08 мая 2019

Вы не добавляете оператор BY.Возможно, вам придется отсортировать данные заранее, PERSON, чтобы это работало, но процесс группы BY эффективен.

proc sgplot data= Original (where=(count = 4));
     BY PERSON;
    scatter x=Date y=QTY/ group = Brand;
run;
1 голос
/ 08 мая 2019

Чтобы использовать цикл таким образом, вам нужно написать код внутри макроса. Также, чтобы получить список разных людей, вы можете использовать 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;
...