我试图遍历大量数据并为每个人创建一个简单的散点图。我想使用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;
有什么建议吗?
答案 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;