首页 > 解决方案 > 如何编写一个为每个独特的人创建图表的 Do-Loop?

问题描述

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

有什么建议么?

标签: sasdo-loopssgplot

解决方案


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


推荐阅读