0

我正在尝试在 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;

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

4

2 回答 2

2

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

PUT(DATE,monname3.) AS MONTH,

应该

DATE AS MONTH FORMAT=monname3.,

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

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

于 2013-11-06T16:24:52.217 回答
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;
于 2013-11-06T16:36:00.843 回答