SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 990|回复: 5
打印 上一主题 下一主题

请教数据求和问题,谢谢。

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2008-11-30 17:20:18 | 只看该作者

请教数据求和问题,谢谢。

现有数据集的格式如下:
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]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2008-12-2 14:32:18 | 只看该作者

Re: 请教数据求和问题,谢谢。

方法一:data步
方法二:proc means ,proc summary,proc tabulate
方法三:proc expand
方法四:proc sql
方法五:proc report
方法六:proc iml
都可以实现
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2008-12-3 12:39:44 | 只看该作者

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;


这样应该是可以的,呵呵
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2008-12-3 16:13:05 | 只看该作者

Re: 请教数据求和问题,谢谢。

回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2008-12-5 23:27:11 | 只看该作者

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;
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
6#
 楼主| 发表于 2008-12-7 23:40:28 | 只看该作者

Re: 请教数据求和问题,谢谢。

多谢chuangwaiyanhua和byes的帮助。
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2026-2-5 07:09 , Processed in 0.068499 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表