请选择 进入手机版 | 继续访问电脑版
楼主: 黎桑
2145 7

[求助]我的程序哪裡出問題了~我不是很懂sas~求救 [推广有奖]

  • 0关注
  • 0粉丝

学前班

60%

还不是VIP/贵宾

-

威望
0
论坛币
16 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
72 点
帖子
3
精华
0
在线时间
0 小时
注册时间
2009-3-5
最后登录
2009-5-22

黎桑 发表于 2009-3-5 05:30:00 |显示全部楼层 |坛友微信交流群

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
我用這個程序去跑資料~但是一直跑不完~跑到我硬碟沒空間就停了(空間75GB)~也沒跑成功~可以請高手大大看看是哪出問題了~麻煩了@@

************************;

    %MACRO CD;

************************;

PROC SORT DATA=P1  ;    BY FID;  RUN;

PROC SORT DATA=DATA;    BY FID;  RUN;

 

PROC TRANSPOSE DATA=DATA PREFIX=I OUT=DATA;

     ID ITM;

     BY FID;

     RUN;

 

DATA SOURCE;

     MERGE DATA P1;

     BY FID;

     ARRAY NUM{*} _NUMERIC_;

     DO X=1 TO DIM(NUM);

        IF NUM{X}=. THEN NUM{X}=0;

     END;

     RETAIN DSP;

     DSP=I400-I600;

PROC DATASETS;

     DELETE DATA P1;

     RUN;

 

%MEND CD;

*************************;

   %MACRO DSPH(YEAR);

*************************;

PROC SORT DATA=SOURCE;

     BY DSP;

     RUN;

 

PROC SUMMARY DATA=SOURCE;

     VAR DSP;

     WEIGHT WT;

     OUTPUT OUT=OUT SUM=SUMDSP SUMWGT=SUMWT;

 

DATA DSP_H&YEAR;

     MERGE SOURCE OUT;

     RETAIN  CM_QTY SSUMWT CT_POT DSP_HOU;

     IF _N_=1 THEN DO;

         DSP_HOU=1;

         CM_QTY=WT;

         CT_POT=ROUND(SUMWT/&CLS);

         SSUMWT=SUMWT;

     END;

     ELSE DO;

         CM_QTY=CM_QTY+WT;

     END;

     IF CM_QTY<CT_POT*DSP_HOU THEN DO;

        OUTPUT;

     END;

     IF CM_QTY=CT_POT*DSP_HOU THEN DO;

        OUTPUT;

        DSP_HOU=DSP_HOU+1;

        IF DSP_HOU>&CLS THEN DO;

           DSP_HOU=&CLS;

        END;

     END;

     IF CM_QTY>CT_POT*DSP_HOU THEN DO;

        IF _N_=1 THEN DO;

            WT=CT_POT;

        END;

        ELSE DO;

            WT=WT+(CT_POT*DSP_HOU)-CM_QTY;

        END;

        IF WT>0 THEN OUTPUT;

            WT=CM_QTY-(CT_POT*DSP_HOU);

        DSP_HOU=DSP_HOU+1;

        IF DSP_HOU>&CLS THEN DO;

           DSP_HOU=&CLS;

        END;

        DO WHILE(WT>=CT_POT);

            TEMPWT=WT;

            WT=CT_POT;

            OUTPUT;

            WT=TEMPWT-WT;

            DSP_HOU=DSP_HOU+1;

            IF DSP_HOU>&CLS THEN DO;

                DSP_HOU=&CLS;

            END;

        END;

        IF WT>0 THEN DO;

            OUTPUT;

        END;

     END;

 

PROC DATASETS;

     DELETE OUT SOURCE;

     RUN;

 

%MEND DSPH;

*********************;

   %MACRO FINAL(YEAR);

*********************;

PROC TABULATE DATA=DSP_H&YEAR FORMCHAR='         '

     FORMAT=COMMA10.0 MISSING;

  VAR DSP;

    WEIGHT WT;

    CLASS DSP_HOU;

TABLE DSP_HOU*DSP*MEAN;

 

%MEND FINAL;

****************************;

   %MACRO INP_D(YEAR,H);

****************************;

TITLE " YEAR &YEAR ";

DATA P1    (KEEP=FID  WT)

     DATA  (KEEP=FID ITM AMT)

     ;

     INFILE 'e:\Sample90.txt'; (資料檔共有三個 sample90.txt   lay90o.txt  hdata90)

     INPUT  @1   AREA   2.

            @79   CARD   2.

            @;

         IF '31'<=AREA<='42' THEN AREA='22';  /*台北市*/

         IF '47'<=AREA<='57' THEN AREA='23';  /*高雄市*/

 

    IF AREA=&H THEN DO;

     IF CARD=01 THEN DO;

        INPUT  @1   FID    $8.

               @65  WT      14.8

               @;

       OUTPUT P1;

     END;

     IF 23<=CARD<=99 THEN DO;

         INPUT  @1  FID    $8. @;

             DO I= 1 TO 5;

                 INPUT ITM     $3.  

                       AMT   ZD11.  @;  

                 IF ITM IN ( &SSS ) THEN OUTPUT DATA;

             END;

     END;

   END;

TITLE &H;

%MEND INP_D;

*************************;

**     MAIN PROGRAM    **;

*************************;

dm 'log;clear;pgm;recall;';

OPTIONS NOCENTER NODATE LS=200 noxwait noxsync;;

%LET CLS=10;

%LET SSS=%STR(400 600);

%INP_D(90,’02’); RUN;

%CD       ;    RUN;  

%DSPH(90);    RUN;

%FINAL(90);    RUN;

//

[em06]
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:Transpose datasets Tabulate dataset Summary 程序 SAS 求救

回帖推荐

yongyitian 发表于6楼  查看完整内容

There are few places that needs to look at.1. Avoid use data=data, out=out, it is better to use another name for the dataset.2. in the statements        IF '31'<=AREA<='42' THEN AREA='22';         IF '47'<=AREA<='57' THEN AREA='23';AREA was input as a number. So try to remove the quotations, or input the AREA as Characte ...

本帖被以下文库推荐

pobel 在职认证  发表于 2009-3-5 09:00:00 |显示全部楼层 |坛友微信交流群

*************************;

   %MACRO DSPH(YEAR);

*************************;       

  DO WHILE(WT>=CT_POT);

            TEMPWT=WT;

            WT=CT_POT;

            OUTPUT;

            WT=TEMPWT-WT;

            DSP_HOU=DSP_HOU+1;

            IF DSP_HOU>&CLS THEN DO;

                DSP_HOU=&CLS;

            END;

        END;

这里是个死循环。

把 OUTPUT; 放到后面应该就可以了。

和谐拯救危机

使用道具

pobel 在职认证  发表于 2009-3-5 09:01:00 |显示全部楼层 |坛友微信交流群
DO WHILE(WT>=CT_POT);

            TEMPWT=WT;

            WT=CT_POT;

          

            WT=TEMPWT-WT;

            DSP_HOU=DSP_HOU+1;

            IF DSP_HOU>&CLS THEN DO;

                DSP_HOU=&CLS;

            END;

           

              OUTPUT;

  

        END;

和谐拯救危机

使用道具

黎桑 发表于 2009-3-5 14:54:00 |显示全部楼层 |坛友微信交流群

我加上了OUTPUT;後跑的結果也是跑不完~可以請大大幫我跑跑看嗎?

我的  MSN:   calvin68919@hotmail.com    感謝~

使用道具

林嘉祥 发表于 2009-3-6 03:24:00 |显示全部楼层 |坛友微信交流群

楼主看的程序太深奥啦,在下深感佩服。

跟OUTPUT statement没有关系,最大的可能是CT_POT missing或极小,以至于您那个循环是子子孙孙无穷馈也(唉,可惜我没有儿子,这句话对我不成立)。您可以在一分钟后终止您的程序,打开名为OUT的dataset,看看SUMWT的值。

平生无大志,唯吃饱ZB,喂饱JB耳!

使用道具

yongyitian 发表于 2009-3-6 09:48:00 |显示全部楼层 |坛友微信交流群
There are few places that needs to look at.
1. Avoid use data=data, out=out, it is better to use another name for the dataset.
2. in the statements
        IF '31'<=AREA<='42' THEN AREA='22';
        IF '47'<=AREA<='57' THEN AREA='23';
AREA was input as a number. So try to remove the quotations, or input the AREA as Character variable
3. Try to input the CARD as character vraiable.
4. Cchange IF CARD=01     to     IF CARD='01'
5. Try  %let SSS=400 600;  instead of        %let SSS=%str(400 600);
6. The statement:      INFILE 'e:\Sample90.txt';   only input one file, not three files.
7. Try to convert macro variable CLS (and others macro variables
   in the condition statement)to number use PUT function.
   You have divided the CLS as character in the statement
         CT_POT=ROUND(SUMWT/&CLS);
   Although SAS may auto convert it to number.
9. It is easier to find something wrong if you can attach the datasets.
已有 1 人评分经验 论坛币 收起 理由
bakoll + 3 + 3 精彩帖子

总评分: 经验 + 3  论坛币 + 3   查看全部评分

使用道具

黎桑 发表于 2009-3-7 04:18:00 |显示全部楼层 |坛友微信交流群

謝謝各位大大的幫忙~目前問題已解決~@@

感恩

使用道具

xmok77 发表于 2009-3-7 11:05:00 |显示全部楼层 |坛友微信交流群
问题解决,沉底
以出世的精神做入世的事情

使用道具

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

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-3-29 20:11