1

我正在尝试遍历一个大型数据集并为每个人创建一个简单的散点图。我想使用 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;

有什么建议么?

4

3 回答 3

2

在 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选项,则会出现错误消息并且可能会出现一些不完整的输出。

于 2019-05-08T15:03:30.177 回答
1

要以这种方式使用 do-loop,您必须在宏中编写代码。此外,要获取不同人员的列表,您可以使用 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;
于 2019-05-08T14:34:13.757 回答
0

你没有,你添加了一个 BY 语句。您可能需要提前按 PERSON 对数据进行排序才能正常工作,但 BY group 流程是有效的。

proc sgplot data= Original (where=(count = 4));
     BY PERSON;
    scatter x=Date y=QTY/ group = Brand;
run;
于 2019-05-08T14:57:29.803 回答