作者kenshin528 (成立奥凶帝国!!)
站内Statistics
标题Re: [程式] SAS同一组内更改变数的方法
时间Thu Mar 11 20:09:53 2010
以下是很不正确的分解动作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
1F:推 paochien:好详细的解释!!! 真的很感谢你>///< 03/11 21:02
2F:→ kenshin528:有看懂就好XD~ 03/11 21:13
3F:→ kenshin528:最後要用DROP丢变项 囧 03/12 10:36