标题: 请教数据求和问题,谢谢。 [打印本页] 作者: 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
%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;
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;