SAS中文论坛

标题: 请教数据求和问题,谢谢。 [打印本页]

作者: shiyiming    时间: 2008-11-30 17:20
标题: 请教数据求和问题,谢谢。
现有数据集的格式如下:
name data date time datetime
Jim 11 01Mar08 0:00:00 01Mar08:00:00:00
Jack 33 01Mar08 0:00:00 01Mar08:00:00:00
Mary 43 01Mar08 0:00:00 01Mar08:00:00:00
……
……
Tom 32 31Mar08 0:00:00 31Mar08:23:00:00
Jack 35 31Mar08 0:00:00 31Mar08:23:00:00
Ben 11 31Mar08 0:00:00 31Mar08:23:00:00
……
David 16 31Oct08 0:00:00 31Oct08:23:00:00
Sam 18 31Oct08 0:00:00 31Oct08:23:00:00

要完成的功能是按照日期进行数据累加,即生成数据集格式:
data date
87 01Mar08
……
……
78 31Mar08
……
34 31Oct08
再由此数据集按照月份累加,得到数据集:
data month
5652 Mar08
……
6321 Oct08

目前的思路是将日期值作为宏变量,然后循环操作,但是Daysum的初始化不知如何解决。下面的程序会导致最终结果Daysum均为0。
请教各位,上述功能应如何实现?谢谢。
[code:amyjkuih]
%MACRO DaySum;         
%DO NF=17592 %TO 17836;

data dataday;  
        set datahour;

        format daysum best32.;
        informat daysum best32.;
        retain daysum 0;

        %if date = &NF. %then %do;
                daysum=SUM(data,daysum);
        %end;

        %if first_date = &NF.+1 %then %do;
                output;
        %end;
        keep date daysum;
run;

%END;
%MEND DaySum;
%DaySum;
[/code:amyjkuih]
作者: shiyiming    时间: 2008-12-2 14:32
标题: Re: 请教数据求和问题,谢谢。
方法一:data步
方法二:proc means ,proc summary,proc tabulate
方法三:proc expand
方法四:proc sql
方法五:proc report
方法六:proc iml
都可以实现
作者: shiyiming    时间: 2008-12-3 12:39
标题: Re: 请教数据求和问题,谢谢。
data datahour;
format date date7.;
input name$ data date date7.;
cards;
Jim 11 01Mar08
Jack 33 01Mar08
Mary 43 01Mar08
Tom 32 31Mar08
Jack 35 31Mar08
Ben 11 31Mar08  
David 16 31Oct08
Sam 18 31Oct08
lucy 20 01Oct08
;
run;

data dataday;
set datahour;
proc sort data=dataday;
by date;
data dataday(keep=date sum);
set dataday;
by date;
if first.date then sum=0;
sum+data;
if last.date then output;
run;

data datamonth;
set dataday;
month=month(date);
proc sort data=datamonth;
by month;
data datamonth;
set datamonth;
by month;
if first.month then summ=0;
summ+sum;
if last.month then output;
run;


这样应该是可以的,呵呵
作者: shiyiming    时间: 2008-12-3 16:13
标题: Re: 请教数据求和问题,谢谢。

作者: shiyiming    时间: 2008-12-5 23:27
标题: Re: 请教数据求和问题,谢谢。
楼主,看了你的代码,我试了下,大概知道是哪里出问题。
%MACRO DaySum;         
%DO NF=17592 %TO 17836;

data dataday;   /*这里每次数据集都是变动的,因此只能保留最后一个满足 %if date = &NF. %then %do;条件的sum*/
   set datahour;

   format daysum best32.;
   informat daysum best32.;
   retain daysum 0;

   %if date = &NF. %then %do; /*这里不能用宏的判断语句,因为这样daysum就不可以识别*/
      daysum=SUM(data,daysum);   /*这里的问题是最严重的,因为只要%DO NF=17592 %TO 17836运行了第一个循环之后,数据
                               集dataday就会生成daysum,因此,只要是以后的循环,就会把daysum和data求和,这
                               显然是错误的*/
   %end;                           

   %if first_date = &NF.+1 %then %do;
      output;
   %end;
   keep date daysum;
run;

%END;
%MEND DaySum;
%DaySum;

为了改正那些问题,把你的程序修改拉,呵呵

data dataday;
set datahour;
keep date;
run;    /*这里是为了宏循环第一次用的数据集*/

%MACRO DaySum;         
%DO NF=17592 %TO 17836;
data dataday;  
merge datahour dataday;  /*用merge就可以每次都保留了sum*/
by date;
format daysum best32.;
informat daysum best32.;
if date =&NF  then do;
      daysum=SUM(data,daysum);
          retain daysum 0;
          sum=daysum;   /*用sum把daysum提取出来,防止下次循环的daysum不为0*/
          keep  date  sum;
  end;

  /* %if first_date = &NF.+1 %then %do;
      output;
   %end;*/
   /*keep date daysum;*/ /*不知道这段语句,搂主要用来干什么*/
run;

%END;
%MEND DaySum;
%DaySum;
作者: shiyiming    时间: 2008-12-7 23:40
标题: Re: 请教数据求和问题,谢谢。
多谢chuangwaiyanhua和byes的帮助。




欢迎光临 SAS中文论坛 (https://mysas.net/forum/) Powered by Discuz! X3.2