标题: 如何排序? [打印本页] 作者: shiyiming 时间: 2010-1-1 09:14 标题: 如何排序? data a;
input group $ x y flag;
cards;
a 1 5 0
a 2 4 1
b 1 6 1
b 1 4 1
b 3 10 0
c 2 7 1
c 3 15 0
c 20 23 1
c 21 27 0
;
(x,y)是时间区间, 每个group中(x,y)相互有重叠,并且根据一定的规则赋值于flag=1或0;
现想把每个group中的各条记录按照flag值重新排列,既,有相互重叠关系的每对(或每3个)记录,按照flag先0后1的顺序进行排列.
如下所示:
group x y flag
a 1 5 0
a 2 4 1
b 3 10 0
b 1 6 1
b 1 4 1
c 3 15 0
c 2 7 1
c 21 27 0
c 20 23 1
想用lag function 来做,既,建一个新变量sub_flag并赋予每个group中第一条记录为sub_flag=1,如果每条记录和上一条记录重叠就赋予这个新变量sub_flag同样的值1,如果不重叠,就让sub_flag=2.最后,根据sub_flag和flag进行排序. 这样做比较啰嗦,也比较笨,所以,就想请教有没有更好的一点的方法?
谢谢!作者: shiyiming 时间: 2010-1-1 10:13 标题: Re: 如何排序? <!-- s:D --><img src="{SMILIES_PATH}/icon_biggrin.gif" alt=":D" title="Very Happy" /><!-- s:D --> 新年快乐!!!
兑水来了,没想到更好的法子...
[code:3vvwravy]data b;
temp_flag=0;
do _n_=1 by 1 until(last.group);
set a;
by group;
if not(lag(x)<=x<=lag(y)) and _n_>1 then temp_flag+1;
output;
end;
run;
proc sort data=b out=b(drop=temp_flag);
by group temp_flag flag;
run;[/code:3vvwravy]作者: shiyiming 时间: 2010-1-7 23:13 标题: Re: 如何排序? 多谢了.
下面有个新的情况,有的记录后面跟了一个类似的记录,除了flag=.以外,其他均相同,规定凡是flag=.的记录必须紧跟在前一个flag^=.的记录后面. 我加了dg,ag两个变量,dg就是temp_flag, ag就是把有flag=.和前面的非flag^=.的放在一组,程序很简单,就不写出来了.如下面这个raw data显示.
问题也是同样的,flag按照先0后1的顺序排列,比如group c,应该排成:
c 3 15 0
c 3 15 .
c 2 7 1
c 2 7 .
c 21 27 0
c 21 27 .
c 20 23 1
c 20 23 .
c 20 23 .
原始数据如下:
data a;
input group $ x y flag ag;
cards;
a 1 5 0 1
a 1 5 . 1
a 2 4 1 2
a 2 4 . 2
b 1 6 1 3
b 1 4 1 4
b 3 10 0 5
c 2 7 1 6
c 2 7 . 6
c 3 15 0 8
c 3 15 . 8
c 20 23 1 9
c 20 23 . 9
c 20 23 . 9
c 21 27 0 10
c 21 27 . 10
;
我的程序时这样写的,好像有点问题,请指教!
data a;
input group $ x y flag;
pk=_n_;
cards;
a 1 5 0
a 1 5 .
a 2 4 1
a 2 4 .
b 1 6 1
b 1 4 1
b 3 10 0
c 2 7 1
c 2 7 .
c 3 15 0
c 3 15 .
c 20 23 1
c 20 23 .
c 20 23 .
c 21 27 0
c 21 27 .
;
data a2; set a; if flag^=.;run;
data b;
do i=1 by 1 until(last.group);
set a2;
retain dg 1;
by group;
if not(lag(x)<=x<=lag(y)) and _n_>1 then dg+1 ;
output;
end;
run;
proc sort data=b out=b1(drop= i);
by group temp_flag flag;
run;
data a;
modify a b1;
by pk;
run;
proc sort data=a out=a3;
by ag;
run;
data c;
do i=1 by 1 until (last.ag);
set a3; by ag;
lagdg=lag(dg);
if flag=. then dg=lagdg;
output;
end;
run;
proc sort data=c out=c2;
by group dg ag;
run;