作者imaltar (..)
站内Statistics
标题Re: [程式] SAS 算移动平均
时间Tue Jan 17 17:22:51 2012
※ 引述《imaltar (..)》之铭言:
: ※ 引述《bbearh (go)》之铭言:
: : [软体程式类别]: sas
: : [程式问题]: 资料处理
: : [问题叙述]:
: : 要处理类似 [移动平均数] 又要以id分组做.
: : 因要平均的不像例子只有2 或 3, 会到30多笔.
: : 这有没有一般的方法可用.
: : 谢谢!
: : --------------------
: : 资料
: : id vol
: : 1 10
: : 1 12
: : 1 9
: : 1 3
: : 2 4
: : 2 5
: : 2 6
: : 2 7
: : 8 1
: : 8 1
: : 8 1
: : ---------------------
: : output:
: : sum2 同一id 往下加两笔
: : sum3 同一id 往下加 3笔
: : 不够资料加的, 变成 .
: : id vol sum2 sum3
: : 1 10 22 31
: : 1 12 21 24
: : 1 9 12 .
: : 1 3 . .
: : 2 4 9 15
: : 2 5 11 18
: : 2 6 13 .
: : 2 7 . .
: : 8 1 2 3
: : 8 1 2 .
: : 8 1 . .
: : 能够分点叙述处理流程,基本上在撰写程式或者跑统计时是相当有帮助的
: : 甚至有经验的人可以藉此告知你步骤是否错误
: : [程式范例]:
: : 虽然张贴程式很可怕,但基本上有些程式还是要张贴才能解决
: : -----------------------------------------------------------------------------
: data a;
: input id vol ;
: cards;
: 1 10
: 1 12
: 1 9
: 1 3
: 2 4
: 2 5
: 2 6
: 2 7
: 8 1
: 8 1
: 8 1
: ;
: run;
: proc sort data=a;by id;
: proc expand data=a out=b method=none;
: by id;
: convert vol=sum2/transformout=(cmovsum 2);
: convert vol=sum3/transformout=(cmovsum 3);
: run;
: data b;set b;
: if sum2=vol then sum2=.; else sum2=sum2;
: run;
: proc expand data=b out=c method=none;
: by id;
: convert sum3=sum3/transformout=(lead 1);
: run;
: data c;set c;if sum3=sum2 then sum3=.;run;
: c就是最後的data
不好意思 没看到可能要做30笔
所以再改了一下
假设资料改成:
data a;
input id vol ;
cards;
1 10
1 12
1 9
1 3
1 8
1 10
1 22
1 28
2 4
2 5
2 6
2 7
2 10
2 13
8 1
8 1
8 1
8 2
8 1
8 3
;
run;
%macro move(n=,in=,out=);
proc sort data=&in. out=&out.;by id;
%do i=2 %to &n.;
proc expand data=a out=b method=none;
by id;
convert vol=sum&i./transformout=(movsum &i.);
run;
proc expand data=b out=c method=none;
by id;
convert sum&i.=sum&i./transformout=(lead %eval(&i.-1));
run;
data &out.;merge &out. c(keep=id sum&i.);run;
%end;
%mend;
%move(n=8,in=a,out=out);
n代表你要往下累加多少笔
in是原始data
out是最後输出的data
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 218.168.218.33
※ 编辑: imaltar 来自: 218.168.218.33 (01/17 20:00)
1F:推 bbearh:感谢, 如果missing value 要对齐放在某个位置, 应没有简单 01/18 00:24
2F:→ bbearh:的方法. 01/18 00:25