SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 2420|回复: 11
打印 上一主题 下一主题

对应排序的编程问题,求助。

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2009-4-14 22:53:38 | 只看该作者

对应排序的编程问题,求助。

原始
a1        a2        a3        ta1        ta2        ta3
10        22        30        5        10        23
10        22        30        50        10        23
10        22        30        5        100        23

结果:
a1        a2        a3        ta1        ta2        ta3
30        22        10        23        10        5
10        30        22        50        23        10
22        30        10        100        23        5

要求是:把ta1,ta2,ta3 要按从大到小排序,然后与之对应当a1,a2,a3,按照ta1,ta2,ta3变动次序变动。
谢谢!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2009-4-15 06:42:45 | 只看该作者

Re: 对应排序的编程问题,求助。

跪求
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2009-4-15 07:29:43 | 只看该作者

Re: 对应排序的编程问题,求助。

基本功啊,基本功。。。。。。
[code:2gq9p6t7]
data ahuige;
input a1 a2 a3 ta1 ta2 ta3;
cards;
10 22 30 5 10 23
10 22 30 50 10 23
10 22 30 5 100 23
;
run;

%macro exchange(x,y);
do; temp=&x;  &x=&y;  &y=temp; end;
%mend;

data final(keep=a1 a2 a3 ta1 ta2 ta3);
  set ahuige;
  array arr (1:2,1:3)a1 a2 a3 ta1 ta2 ta3;
    do j=1 to 2;
      do i=j+1 to 3;
       if arr(2,j)<arr(2,i) then %exchange(arr(1,j),arr(1,i));
       if arr(2,j)<arr(2,i) then %exchange(arr(2,j),arr(2,i));
      end;
    end;
run;
[/code:2gq9p6t7]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2009-4-15 13:46:09 | 只看该作者

Re: 对应排序的编程问题,求助。

ahuige的编程基础不是一般的扎实啊,C之类的估计当小菜切了。

下面是我的程序,以饲大家。
说起来和ahuige的思路差不多,不过是下面用到了SAS的两个函数,没有使用到宏。

[code:nn72it69]data  ex;
input a1 a2  a3 ta1 ta2 ta3;
cards;
10   22   30   5   10   23
10   22   30   50   10   23
10   22   30   5   100   23
;
run;
data ex2 (drop=aa1-aa3 xa1-xa3 i j);
   set ex;
    aa1=ta1;aa2=ta2;aa3=ta3;
        xa1=a1;xa2=a2;xa3=a3;
   call sortn(of ta:);
   array arr_a{3} a1-a3;
   array arr_aa{3} aa:;
   array arr_xa{3} xa:;
    do i=1 to 3;
      do j= 1 to 3;
       if arr_aa{j}=ordinal(i,of ta:) then arr_a{i}=arr_xa{j};
       end;
    end;
run;[/code:nn72it69]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2009-4-15 13:48:08 | 只看该作者

Re: 对应排序的编程问题,求助。

to 徐福贵

思路都不错!特别是能提供这么多种思路,谢谢!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
6#
 楼主| 发表于 2009-4-15 14:43:36 | 只看该作者

Re: 对应排序的编程问题,求助。

都是日月级别的大牛啊!相比之下我们之流只能是萤火啊。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
7#
 楼主| 发表于 2009-4-15 19:32:30 | 只看该作者

Re: 对应排序的编程问题,求助。

[code:fwqo7y8a]
proc iml;
    use ex;
    read all var {a1 a2 a3} into A;
    read all var {ta1 ta2 ta3} into B;

    do i=1 to nrow(B);
        tmp=B[i,];tmp1=A[i,];
                R=ncol(B)-rank(tmp)+1;
        B[i,R]=tmp;A[i,R]=tmp1;
    end;
    C=A||B;

        create result1 var {a1 a2 a3 ta1 ta2 ta3};
        append from C;
quit;
[/code:fwqo7y8a]
--------------------------------------------------------------------------------
[code:fwqo7y8a]
proc iml;
        M=contents('work','ex');
        use ex;
        read all var _num_ into EX;
        do i=1 to nrow(EX);
                tmp=EX[i,(ncol(EX)/2+1):ncol(EX)];R=ncol(EX)-rank(tmp)+1;EX[i,R]=tmp;
                tmp=EX[i,1:ncol(EX)/2];EX[i,R-ncol(EX)/2]=tmp;
        end;
        create result2 from EX[colname=M];
        append from EX;
quit;
[/code:fwqo7y8a]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
8#
 楼主| 发表于 2009-4-15 20:04:34 | 只看该作者

Re: 对应排序的编程问题,求助。

by the way :data步+proc mean也可以实现
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
9#
 楼主| 发表于 2009-4-15 22:31:35 | 只看该作者

Re: 对应排序的编程问题,求助。

注:当ta1-ta3有重复取值时,用base中的ordinal函数可能会有问题,但IML中的rank函数仍然可以。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
10#
 楼主| 发表于 2009-4-15 23:41:14 | 只看该作者

Re: 对应排序的编程问题,求助。

原来的那个程序有个错误,已修改。

不过好像对值相等的bug不好去。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-13 20:11 , Processed in 0.072298 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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