看板 Statistics 關於我們 聯絡資訊
※ 引述《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