Re: [程式] SAS同一組內更改變數的方法

看板Statistics作者 (成立奧凶帝國!!)時間16年前 (2010/03/11 20:09), 編輯推噓1(102)
留言3則, 2人參與, 最新討論串3/3 (看更多)
以下是很不正確的分解動作XD 因為SAS DATA STEP一次只讀一行CASE 但是這樣子舉例比較方便 囧~ ※ 引述《kenshin528 (成立奧凶帝國!!)》之銘言: : DATA test; : SET origin; /*原始檔*/ 做完這個步驟的資料(也就是原始資料) Obs ID year DUM1 1 A 2001 0 2 A 2002 1 3 A 2003 0 4 A 2004 0 5 B 1993 1 6 B 1994 0 7 B 1995 0 8 C 1996 0 9 C 1997 0 10 C 1998 1 11 C 1999 1 12 C 2000 0 : IF dum1 = 1 THEN dum2 = 1;/*產生一個新的變項作為對照組*/ Obs ID year DUM1 dum2 1 A 2001 0 . 2 A 2002 1 1 3 A 2003 0 . 4 A 2004 0 . 5 B 1993 1 1 6 B 1994 0 . 7 B 1995 0 . 8 C 1996 0 . 9 C 1997 0 . 10 C 1998 1 1 11 C 1999 1 1 12 C 2000 0 . : IF first.id THEN dum2 = dum1; 因為你有些變項第一個不是0 所以只好再補一條敘述 Obs ID year DUM1 dum2 1 A 2001 0 0 2 A 2002 1 1 3 A 2003 0 . 4 A 2004 0 . 5 B 1993 1 1 6 B 1994 0 . 7 B 1995 0 . 8 C 1996 0 0 9 C 1997 0 . 10 C 1998 1 1 11 C 1999 1 1 12 C 2000 0 . : RETAIN dum2 0; SAS處理資料是一次處理一行 retain dum2 0的意思是說, 當我在處理DUM2這個變項的時候,手裡先拿著0, 如果該變項沒有數值(DUM2為MISSING的時候),就把手上的0放進去, 如果那個dum2裡面有數值,就把手上的0丟掉,把碰到的數值拿在手上, 如果下一行的dum2裡面沒有數值,就把手上的數值填進去。 by id的意思是說,遇到新的ID,就把之前拿到的數字丟掉,從0開始。 分解動作如下 手裡>>0 Obs ID year DUM1 dum2 1 A 2001 0 0 <<有數值 就把手裡的0丟掉,把裡面的0拿起來 手裡>>0 2 A 2002 1 1 <<又有數值,把手裡的0丟掉,把1拿起來 手裡>>1 3 A 2003 0 . <<挖,裡面沒有東西,就把1丟進去 3 A 2003 0 1 <<然後又把1拿起來 手裡>>1 4 A 2004 0 . <<又沒東西,就把手裡的1丟進去 4 A 2004 0 1 <<把1拿起來 手裡>>0 5 B 1993 1 1 <<ID換了,所以手裡要拿0,然後又遇到1所以把1拿起來 >>以下以此類推@@ 6 B 1994 0 . 7 B 1995 0 . 8 C 1996 0 0 9 C 1997 0 . 10 C 1998 1 1 11 C 1999 1 1 12 C 2000 0 . : BY ID; : dum1=dum2; /*讓舊變項等於新變項*/ : DELETE dum2; /*刪去新變項*/ 上面兩行不用解釋吧? 就是把新的變項換成你要的DUM1而已 : RUN; : 你試試看吧 感覺起來應該有更簡單的寫法 : ※ 引述《paochien (煩躁的調子)》之銘言: : : ------------------------------------------------------------------------ : : [軟體程式類別]: : : SAS : : [程式問題]: : : 資料處理 : : [軟體熟悉度]: : : 新手(不到1個月) : : [問題敘述]: : : 我的資料是長這樣 : : Obs ID year DUM1 : : 1 A 2001 0 : : 2 A 2002 1 : : 3 A 2003 0 : : 4 A 2004 0 : : 5 B 1993 1 : : 6 B 1994 0 : : 7 B 1995 0 : : 8 C 1996 0 : : 9 C 1997 0 : : 10 C 1998 1 : : 11 C 1999 1 : : 12 C 2000 0 : : Dum1是利用其他變數做為criteria而得的一個dummay variable : : 現在的問題是想要把同一間公司只要dum1是1之後的所有年份都該為1 : : 就會變成 : : Obs ID year DUM1 : : 1 A 2001 0 : : 2 A 2002 1 : : 3 A 2003 1 : : 4 A 2004 1 : : 5 B 1993 1 : : 6 B 1994 1 : : 7 B 1995 1 : : 8 C 1996 0 : : 9 C 1997 0 : : 10 C 1998 1 : : 11 C 1999 1 : : 12 C 2000 1 : : 我翻了一些書也找了一些網站,是過lag來加減看看 : : 可是最後的結果都會有一些被漏掉沒改成1 : : 不知道各位前輩有沒有比較好的辦法可以指點一下<(_ _)> : : 新手很笨的問題請多包涵Orz -- (C)lass 【 分組討論區 】 11 卡漫夢工廠 卡通, 漫畫, 動畫 [Ckmike] 4 C_J_Artist 作家 Σ日本漫畫家專區 [Ckmike] 10 TakahasiShin 作家 ◎****高橋真作品討論版**** kenshin528 http://kenshinsasstory.blogspot.com/ SAS Story -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 111.252.92.238

03/11 21:02, , 1F
好詳細的解釋!!! 真的很感謝你>///<
03/11 21:02, 1F

03/11 21:13, , 2F
有看懂就好XD~
03/11 21:13, 2F

03/12 10:36, , 3F
最後要用DROP丟變項 囧
03/12 10:36, 3F
文章代碼(AID): #1BcDsK4- (Statistics)
文章代碼(AID): #1BcDsK4- (Statistics)