Re: [程式] SAS同一組內更改變數的方法
以下是很不正確的分解動作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
03/11 21:13, 2F
→
03/12 10:36, , 3F
03/12 10:36, 3F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 3 之 3 篇):