SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 649|回复: 2
打印 上一主题 下一主题

如何排序?

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2010-1-1 09:14:36 | 只看该作者

如何排序?

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进行排序. 这样做比较啰嗦,也比较笨,所以,就想请教有没有更好的一点的方法?
谢谢!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2010-1-1 10:13:06 | 只看该作者

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&#46;group);
                set a;
                by group;
                if not(lag(x)&lt;=x&lt;=lag(y)) and  _n_&gt;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]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2010-1-7 23:13:36 | 只看该作者

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)&lt;=x&lt;=lag(y)) and  _n_&gt;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;
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2026-2-6 09:45 , Processed in 0.192597 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表