作者stvene ( )
看板Statistics
標題Re: [問題] SAS 資料處理
時間Mon Feb 27 21:56:00 2012
經驗分享,有誤或有更簡潔的用法請指正
※ 引述《summerslam (BB)》之銘言:
: data:
: date ACC bs vol time
: 20010101 12 b 5 10:16:48.760000
: 20010107 12 s 1 12:00:05.230000
: 20010101 15 b 4 10:16:48.760000
: 20010107 15 s 1 12:00:05.230000
: 20010107 15 s 1 12:03:15.150000
: 20020209 23 b 3
: 20030205 37 b 5 10:25:25.250000
: 20030704 37 s 3 11:02:15.230000
: 想問的是 (1)如果中間有資料時間為空白(不是 '.'),要如何刪除?
: (2)只想抓出03年的資料
: (3)想要計算淨數量變化 也就是如果BS=B 則VOL為正的
: 若BS為S,則VOL為負值,然後加總數量,以ACC來分別計算
: (3)想要的結果為:
: date ACC bs vol time NETVOL ACQ
: 20010101 12 b 5 10:16:48.760000 5 5
: 20010107 12 s 1 12:00:05.230000 -1 4
: 20010101 15 b 4 10:16:48.760000 4 4
: 20010107 15 s 1 12:00:05.230000 -1 3
: 20010107 15 s 1 12:03:15.150000 -1 2
: 20030205 37 b 5 10:25:25.250000 5 5
: 20030704 37 s 3 11:02:15.230000 -3 2
: [程式範例]:
: (1)我的指令為:
: data ata.test;
: set ata.data;
: if time=. then delete;
: run;
time屬性是文字吧? 「.」是數值missing的用法
IF time='' THEN DELETE;
中間不用空白
: (2)指令為
: data ata.test;
: set ata.data;
: where date contains '2003';
: run;
DATA ata.test;
SET ata.data;
IF SUBSTR(date,1,4)='2003';
RUN;
SUBSTR: 取date變項第一位到第四位的內容
: (3)計算NETVOL指令為
: 計算ACQ指令為
: data ata.test;
: set ata.data ;
: RETAIN ACQ 0;
: ACQ=ACQ + vol;
: if acc^=lag(acc) then ACQ=vol;
: run;(這段是看板上學的)
RETAIN的話則是每次讀進一筆觀察值的時候那個變項值會是上一筆觀察值的值
而且看你說想要的狀況跟ACC好像沒有關係?
看你想要結果的意思是要負的才減去,正的就保留?
DATA ata.test;
SET ata.test;
IF bs='b' THEN ACQ=vol;
ELSE IF bs='s' THEN ACQ+(-vol);
RUN;
用的是
http://0rz.tw/9Ya7P SUM statement
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 203.71.94.31
1F:推 west1996:第一題處理missing value時可以參考「missing」這一個 02/28 00:46
2F:→ west1996:function,就不用管變數到底是文字型或數字型了,一勞永 02/28 00:47
3F:→ west1996:逸,試試看XD 02/28 00:47
4F:推 summerslam:謝謝兩位提供的方法,我明天試試看,再次感謝! 02/28 00:57
5F:→ summerslam:第三點我是因為想要每個acc分別計算,所以acc一換 02/28 00:59
6F:→ summerslam:就要重新計算,所以才那樣打 但就error 窘 02/28 01:00
7F:→ summerslam:我有修改一下我原文的敘述了,s大請看看是否有較清楚 02/28 01:11
8F:推 summerslam:s大,你的第三段應該是我想要的netvol,但我試了跑不出 02/28 13:51
9F:→ stvene:倒數第二個b為什麼變+? 03/01 01:09
10F:→ summerslam:因為我以帳號分 帳號37 如果bs是b後面vol就取正 03/01 23:05
抱歉我現在仔細看才看到你有推說要以帳號分
所以以帳號分,帳號裡的b就要加,s就要減
PROC SORT DATA=ata.test; BY acc date;
RUN;
DATA ata.test;
SET ata.test;
BY acc;
IF first.acc THEN ACQ=0;
acq+netvol;
RUN;
這樣看看
※ 編輯: stvene 來自: 114.32.31.217 (03/03 02:13)
11F:→ summerslam:s大謝謝 我試看看 y 03/03 17:22