按月计算条形图 - SAS EG

时间:2013-11-06 15:59:31

标签: sas enterprise-guide

我正在尝试在SAS Enterprise Guide中创建条形图。该图表是按月储蓄。 输入数据是

Ref      Date       Savings
A      03JUN2013      1000
A      08JUN2013      2000
A      08JUL2013      1500
A      08AUG2013      300
A      08NOV2013      100
B      09DEC2012      500
B      09MAY2013      400
B      19MAY2013      5999
B      09OCT2013      511
C      15OCT2013      1200
C      01NOV2013      1500

我做的第一步是将日期转换为月份。我使用PROC MEANS计算Ref。按月计算的总节省量。 然后我创建一个条形图。我得到的问题是条形图不是按顺序排列。就像它是AUG13 JUl13 JUN13 ..等而不是JUN JUL AUG。

PROC SQL;
   CREATE TABLE SAVINGS_11 AS 
   SELECT 
      PUT(DATE,monname3.) AS MONTH,
          (DATE) FORMAT=MONNAME3. AS MONTH1,
      MONTH(DATE) AS MONTH2,
      PUT(DATE,MONYY5.) AS MONTH3,
      (DATE) FORMAT=MONYY5. AS MONTH4,
          DATE, 
          REF,  
          SAVINGS

      FROM INPUT;
QUIT;

/* -------------------------------------------------------------------
   Sort data set
   ------------------------------------------------------------------- */
PROC SORT
    DATA=SAVINGS_11(KEEP=SAVINGS MONTH MONTH1 MONTH2 MONTH3 MONTH4 REF)
    OUT=SORT1;
    BY REF;
RUN;
/* -------------------------------------------------------------------
   Run the Means Procedure
   ------------------------------------------------------------------- */
TITLE;
TITLE1 "Summary";
TITLE2 "Results";
FOOTNOTE;
PROC MEANS DATA=SORT1
    NOPRINT
    CHARTYPE
    NOLABELS
    NWAY

        SUM NONOBS  ;
    VAR SAVINGS;
    CLASS MONTH /   ORDER=DATA ASCENDING;
    BY REF;
    ID MONTH1 MONTH2 MONTH3 MONTH4;

OUTPUT  OUT=MEANSUMMARY
        SUM()=

    / AUTONAME AUTOLABEL  WAYS INHERIT
    ;
RUN;
/* -------------------------------------------------------------------
   End of task code.
   ------------------------------------------------------------------- */
RUN; QUIT;
TITLE; FOOTNOTE;

PROC SORT
    DATA=MEANSUMMARY(KEEP=MONTH MONTH2 "SAVINGS_Sum"n REF)
    OUT=SORT2
    ;
    BY REF MONTH2;
RUN;
Axis1
    STYLE=1
    WIDTH=1
    MINOR=NONE


;
Axis2
    STYLE=1
    WIDTH=1


;
TITLE;
TITLE1 "Bar Chart";
FOOTNOTE;
PROC GCHART DATA=SORT2
;
    VBAR 
     MONTH
 /
    SUMVAR="SAVINGS_Sum"n
    CLIPREF
FRAME   LEVELS=ALL
    TYPE=SUM
    INSIDE=SUM
    COUTLINE=BLACK
    RAXIS=AXIS1
    MAXIS=AXIS2
;
    BY REF;
/* -------------------------------------------------------------------
   End of task code.
   ------------------------------------------------------------------- */
RUN; QUIT;
TITLE; FOOTNOTE;

无论使用何种格式,最终结果都不是按顺序排列的。请帮忙。

2 个答案:

答案 0 :(得分:2)

您的问题是您将日期值转换为字符变量。 MONTH,至少应该是格式化的日期变量,而不是字符变量;所以这一行:

PUT(DATE,monname3.) AS MONTH,

应该是

DATE AS MONTH FORMAT=monname3.,

大多数程序(如PROC MEANS和PROC GPLOT)将遵循相同格式的值格式和分组。我不完全理解为什么你有5个月的变量都包含相同的东西的不同版本,所以也许有更好的方法来做你在这里做的事情。

特别是,如果你有SAS 9.2或更高版本,SGPLOT可能会为你完成整个过程,而不需要任何摘要步骤。

答案 1 :(得分:1)

除了上面提到的Joe之外,如果您希望能够在x轴上查看每个参考的所有月份,还需要在DISCRETE语句中包含关键字VBAR他们进行了保存(注意:如果某些引用在几个月内没有任何节省,这将产生警告消息。)

您可以尝试以下代码,我相信会生成您所需的输出:

PROC SQL;
   CREATE TABLE DATA_TO_PLOT AS 
   SELECT 
      REF
      ,INPUT(PUT(date,YYMMN6.),YYMMN6.) FORMAT =DATE9. AS MONTH
      ,SUM(Savings) AS MONTHLY_SAVINGS
      FROM INPUT
    GROUP BY 1,2
    ORDER BY 1,2 ;
QUIT;

Axis1 STYLE=1 WIDTH=1 MINOR=NONE;
Axis2 STYLE=1 WIDTH=1;
TITLE;
TITLE1 "Bar Chart";

PROC GCHART DATA=DATA_TO_PLOT;
VBAR MONTH 
 /  SUMVAR=MONTHLY_SAVINGS
    CLIPREF
FRAME    TYPE=SUM
    COUTLINE=BLACK
    RAXIS=AXIS1
    MAXIS=AXIS2
INSIDE=SUM
    DISCRETE
;
    FORMAT MONTH MONYY7.;
    BY Ref;
RUN; QUIT;