s******o 发帖数: 656 | 1 各位帮忙看看,多谢多谢!
下边的例子是从我的数据里摘出来的一部分,有四个vairiables:person,year,还有
x和y。
其中x有两个值0和1,y有两个值0和-1,并且x是1的时候y不可能是-1只能是0,y是-1的
时候x不会是1.
Data one;
Input person year x y;
datalines;
1 1990 0 0
1 1991 1 0
1 1992 0 0
1 1993 1 0
1 1994 0 0
1 1995 1 0
1 1996 0 -1
1 1997 1 0
1 1998 0 -1
1 1999 0 -1
2 1991 1 0
2 1992 0 0
2 1993 0 0
2 1994 1 0
2 1995 1 0
2 1996 0 -1
2 1997 1 0
2 1998 0 -1
2 1999 0 -1
;
Run;
我想要做的是:新建一个variable:z,设置为0,整个data按person按year排序后,对
每一个person从早的年份(year)往下看,**如果x出现两次1而且两次1的中间y不能出
现-1,则从第一次出现1那一年开始往后,z设置为1,直到y出现-1。然后再重复**后边
的步骤。 |
s******o 发帖数: 656 | 2 结果应该是下边这个样子
per year x y z;
1 1990 0 0 0
1 1991 1 0 1
1 1992 0 0 1
1 1993 1 0 1
1 1994 0 0 1
1 1995 1 0 1
1 1996 0 -1 0
1 1997 1 0 0
1 1998 0 -1 0
1 1999 0 -1 0
2 1991 1 0 1
2 1992 0 0 1
2 1993 0 0 1
2 1994 1 0 1
2 1995 1 0 1
2 1996 0 -1 0
2 1997 1 0 0
2 1998 0 -1 0
2 1999 0 -1 0
;
【在 s******o 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 各位帮忙看看,多谢多谢! : 下边的例子是从我的数据里摘出来的一部分,有四个vairiables:person,year,还有 : x和y。 : 其中x有两个值0和1,y有两个值0和-1,并且x是1的时候y不可能是-1只能是0,y是-1的 : 时候x不会是1. : Data one; : Input person year x y; : datalines; : 1 1990 0 0 : 1 1991 1 0
|
j******o 发帖数: 127 | 3 data two;
set one;
by person;
if first.person then do; z=0; n=0; end;
retain z n;
if x=1 then z=1;
if y=-1 then do; z=0; n=1; end;
if n=1 then z=0;
drop n;
run; |
s******o 发帖数: 656 | 4 这个code对每个person里至少有两个x是1的情况适用,但是如果有一个person只有一个
x是1,那么这个person对应的z就都是0,这个code给出的结果是z都是1比方说
Data one;
Input person year x y;
datalines;
1 1990 0 0
1 1991 1 0
1 1992 0 0
1 1993 1 0
1 1994 0 0
1 1995 1 0
1 1996 0 -1
1 1997 1 0
1 1998 0 -1
1 1999 0 -1
2 1991 1 0
2 1992 0 0
2 1993 0 0
2 1994 1 0
2 1995 1 0
2 1996 0 -1
2 1997 1 0
2 1998 0 -1
2 1999 0 -1
3 1991 1 0
3 1992 0 0
3 1993 0 0
3 1994 0 0
3 1995 0 0
3 1996 0 0
3 1997 0 0
3 1998 0 0
3 1999 0 0
;
Run;
data two;
set one;
by person;
if first.person then do; z=0; n=0; end;
retain z n;
if x=1 then z=1;
if y=-1 then do; z=0; n=1; end;
if n=1 then z=0;
run;
结果是
person year x y z n
1 1990 0 0 0 0
1 1991 1 0 1 0
1 1992 0 0 1 0
1 1993 1 0 1 0
1 1994 0 0 1 0
1 1995 1 0 1 0
1 1996 0 -1 0 1
1 1997 1 0 0 1
1 1998 0 -1 0 1
1 1999 0 -1 0 1
2 1991 1 0 1 0
2 1992 0 0 1 0
2 1993 0 0 1 0
2 1994 1 0 1 0
2 1995 1 0 1 0
2 1996 0 -1 0 1
2 1997 1 0 0 1
2 1998 0 -1 0 1
2 1999 0 -1 0 1
3 1991 1 0 1 0
3 1992 0 0 1 0
3 1993 0 0 1 0
3 1994 0 0 1 0
3 1995 0 0 1 0
3 1996 0 0 1 0
3 1997 0 0 1 0
3 1998 0 0 1 0
3 1999 0 0 1 0
但是想要的结果是对于person 3,z全是0,因为只有一个x的值是1
不过还是多谢,包子奉上请查收
【在 j******o 的大作中提到】![](/moin_static193/solenoid/img/up.png) : data two; : set one; : by person; : if first.person then do; z=0; n=0; end; : retain z n; : if x=1 then z=1; : if y=-1 then do; z=0; n=1; end; : if n=1 then z=0; : drop n; : run;
|