如何编写一个为每个唯一的人创建图的模拟循环?

时间:2019-05-08 14:18:11

标签: sas do-loops sgplot

我试图遍历大量数据并为每个人创建一个简单的散点图。我想使用do循环和proc sgplot在SAS中运行它。

我的数据集如下:

 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)。我想为每个唯一的人创建一个散点图,在x轴上显示日期,在y上显示数量。然后,我想按品牌分组。

当前我的代码是:

%do i =1 to count(distinct(Person));
proc sgplot data= Original (where=(count = 4))
    scatter x=Date y=QTY/ group = Brand;
run;
end;

有什么建议吗?

3 个答案:

答案 0 :(得分:3)

在SAS中,通常通过BY语句为为每个概念做某事。 Proc将执行您期望的操作,并根据by变量的不同值自动分组处理数据!

此示例演示了如何将by变量值放置在图表标题(#byval1)中,以及如何取消显示person = < em> name 作为副标题。带有可选参数 nobyline BY PERSON语句表示该组的行将通过连续的值相邻性逐行形成,从而允许{{ 1}}处理可以正常工作,即使没有按NOTSORTED对数据进行排序。为了更安全地操作,请先对by变量设置的数据进行预排序或索引。

by

人员Person 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选项,则会出现错误消息,并可能会输出一些不完整的内容。 / p>

答案 1 :(得分:1)

要以这种方式使用循环,您将必须在宏中编写代码。另外,要获取不同人员的列表,可以使用proc sql的select into:功能。

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

答案 2 :(得分:1)

不,您添加BY语句。您可能需要提前按PERSON对数据进行排序,以使其正常工作,但按组进行处理是有效的。

proc sgplot data= Original (where=(count = 4));
     BY PERSON;
    scatter x=Date y=QTY/ group = Brand;
run;