楼主: rickto
2542 6

求助代码,有关SAS的循环绘图,急。 [推广有奖]

  • 2关注
  • 0粉丝

本科生

69%

还不是VIP/贵宾

-

威望
0
论坛币
1202 个
通用积分
0
学术水平
0 点
热心指数
1 点
信用等级
0 点
经验
3536 点
帖子
49
精华
0
在线时间
156 小时
注册时间
2009-9-9
最后登录
2022-9-10

楼主
rickto 发表于 2015-9-1 21:53:39 |AI写论文
100论坛币
有一个数据表,变量N个,变量名各异,其中前3个固定是 shop_name, shop_date, item_name,后面的所有变量都是来描述这3个变量所表明的一个事务的某一特征。

可能下面这样会好理解一点:
商品名    商店   时间        销售额  销量  ……
黑板擦    A       2015-1-1    500    100 ……
黑板擦    B       2015-1-1    400    60 ……
黑板擦    C       2015-1-1    300    50 ……

变量数量是未知的

现在想要通过作图来循环绘图,用item_name来分组,shop_date是横轴也就是时间,如果用上边例子来表示的话就是对商品进行分类绘制各店铺随着时间线而变化的销售额、销量等图表。

求教下代码。

疑问点主要是将作图程序放到MACRO里还是通过循环变量来不断绘图呢?

最佳答案

chiant 查看完整内容

明白了, 那这个应该是你想要的图吧: 如果有多个分类变量, 可以把分类变量存在一个sas macro里, 用空格分隔 %let loopvar=item_name1 item_name2 item_name3;[/backcolor] 完整的循环程序如下:
关键词:sas的 Macro name shop item 黑板擦 商品名 数据表 销售额

沙发
chiant 发表于 2015-9-1 21:53:40
rickto 发表于 2015-9-3 14:12
首先,感谢您的回复。

但是,一方面数据表的变量是无法衡量有多少个的,变量从40到60个不等。另一方面 ...
明白了, 那这个应该是你想要的图吧:
SGPANEL2

  1. proc sql noprint;
  2.         create table sale as
  3.                 select
  4.                         month as date format=date9. label="Sale Date",
  5.                         country as shop label="Shop",
  6.                         division as item_name label="Item Name (Classification Variable)",
  7.                         sum(actual) as sale_amount label="Sale Amount"
  8.                 from sashelp.prdsale
  9.                         group by month, country, division
  10.                                 order by country, division, month
  11.         ;
  12. quit;

  13. proc sgpanel data=sale;
  14.         PANELBY item_name /ONEPANEL COLUMNS=1;
  15.                 series x=date y=sale_amount /group=shop;
  16. run;
复制代码

如果有多个分类变量, 可以把分类变量存在一个sas macro里, 用空格分隔   
%let loopvar=item_name1 item_name2 item_name3;


完整的循环程序如下:
  1. %macro loop_plot;
  2.         %let loopvar=item_name1 item_name2 item_name3;
  3.         %let loopn=%sysfunc(countw(&loopvar));
  4.         %do i=1 %to &loopn.;
  5.                 proc sgpanel data=sale;
  6.                         PANELBY %scan(&loopvar.,&i) /ONEPANEL COLUMNS=1;
  7.                         series x=date y=sale_amount /group=shop;
  8.                 run;
  9.         %end;
  10. %mend;

  11. %loop_plot;
复制代码


藤椅
rickto 发表于 2015-9-1 22:01:58
天仙配222 发表于 2015-9-1 21:57
蓝蓝的天空下,总是有楼主您的身影!

bjfp520.jimdo.com,shfp520.jimdo.com,gzfp520.jimdo.com,szfp520. ...
初学的痛苦。

板凳
rickto 发表于 2015-9-2 19:18:09
求高手指点~

报纸
chiant 发表于 2015-9-3 00:16:41
不需要写循环,用PROC SGPANEL可以完美解决(SAS 9.2以上版本支持)。
我以SASHELP库里的prdsale数据集为例:
  1. proc sql noprint;
  2.         create table sale as
  3.                 select
  4.                         month as date format=date9. label="Sale Date",
  5.                         country as shop,
  6.                         division as item_name,
  7.                         sum(actual) as sale_amount label="Sale Amount"
  8.                 from sashelp.prdsale
  9.                         group by month, country, division
  10.                                 order by country, division, month
  11.         ;
  12. quit;

  13. proc sgpanel data=sale;
  14.         PANELBY item_name shop /layout=lattice novarname;
  15.                 series x=date y=sale_amount;
  16. run;
复制代码
输出的线图效果如下:
SGPANEL EXAMPLE

地板
rickto 发表于 2015-9-3 14:12:53
chiant 发表于 2015-9-3 00:16
不需要写循环,用PROC SGPANEL可以完美解决(SAS 9.2以上版本支持)。
我以SASHELP库里的prdsale数据集为例 ...
首先,感谢您的回复。

但是,一方面数据表的变量是无法衡量有多少个的,变量从40到60个不等。另一方面,绘制图的时候,希望能在一个图上绘制出不同店铺的时间走势。

现在就是商品、店名、日期数据都是固定需要拿出来的变量,还有一个变量需要从数据表中依次读取,做图表就是以商品进行分类,来看每个店铺的某项数据的表现对比。

这样就是有多少个要表现的变量就需要绘制多少张图。

因为是初学SAS编程,所以对程序使用还是还有些混乱。我看有人提取数据表的变量的代码:
       proc sql noprint;
          select name into :varname separated by ' ' from DICTIONARY.COLUMNS
          where libname = "EG4" and memname = "TEST1" and name<>"shop_date" and name<>"shop_name" and name<>"item_name";
       run;

但是无法用 GPLOT 来进行绘图。貌似要用MACRO、SCAN之类的来构架一个循环。这个真就不了解了。

还希望大家能指导。

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-26 06:06