作者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)
推 bbearh:感謝, 如果missing value 要對齊放在某個位置, 應沒有簡單 01/18 00:24
→ bbearh:的方法. 01/18 00:25