SAS中文论坛

标题: 对应排序的编程问题,求助。 [打印本页]

作者: shiyiming    时间: 2009-4-14 22:53
标题: 对应排序的编程问题,求助。
原始
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变动次序变动。
谢谢!
作者: shiyiming    时间: 2009-4-15 06:42
标题: Re: 对应排序的编程问题,求助。
跪求
作者: shiyiming    时间: 2009-4-15 07:29
标题: 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]
作者: shiyiming    时间: 2009-4-15 13:46
标题: 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]
作者: shiyiming    时间: 2009-4-15 13:48
标题: Re: 对应排序的编程问题,求助。
to 徐福贵

思路都不错!特别是能提供这么多种思路,谢谢!
作者: shiyiming    时间: 2009-4-15 14:43
标题: Re: 对应排序的编程问题,求助。
都是日月级别的大牛啊!相比之下我们之流只能是萤火啊。
作者: shiyiming    时间: 2009-4-15 19:32
标题: 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]
作者: shiyiming    时间: 2009-4-15 20:04
标题: Re: 对应排序的编程问题,求助。
by the way :data步+proc mean也可以实现
作者: shiyiming    时间: 2009-4-15 22:31
标题: Re: 对应排序的编程问题,求助。
注:当ta1-ta3有重复取值时,用base中的ordinal函数可能会有问题,但IML中的rank函数仍然可以。
作者: shiyiming    时间: 2009-4-15 23:41
标题: Re: 对应排序的编程问题,求助。
原来的那个程序有个错误,已修改。

不过好像对值相等的bug不好去。
作者: shiyiming    时间: 2010-12-20 05:27
标题: Re: 对应排序的编程问题,求助。
to sxlion
今天真无聊,来做道题,给个笨办法

[code:12ffpqtn]

data a;
input a1        a2        a3        ta1        ta2        ta3;
id=_n_;
array _x{*}  a   ta;
array _a{*}  a1-a3;
array _ta{*}  ta1-ta3;
_name_='a';
do j=1 to dim(_a);
    _x[1]=_a[j];  _x[2]=_ta[j];
    seq=j;
    output;
end;

keep id  seq  a  ta;
cards;
10        22        30        5        10        23
10        22        30        50        10        23
10        22        30        5        100        23
;
run;

proc sort data=a  out=as  equals ;  by id  descending ta; run;


proc transpose data=as  out=b;
        by id;
                var a ta;
run;

data a2;
        merge  b(where=(_name_='a')  rename=(col1-col3=a1-a3) )
                   b(where=(_name_='ta')  rename=(col1-col3=ta1-ta3));
run;
[/code:12ffpqtn]
作者: shiyiming    时间: 2010-12-20 05:30
标题: Re: 对应排序的编程问题,求助。
仰望虫虫
[quote="shiyiming":dk4je8gk]都是日月级别的大牛啊!相比之下我们之流只能是萤火啊。[/quote:dk4je8gk]




欢迎光临 SAS中文论坛 (https://mysas.net/forum/) Powered by Discuz! X3.2