从SAS中的矩阵计算订单统计信息

从SAS中的矩阵计算订单统计信息,sas,Sas,我在SAS/IML中有一个矩阵: x = {7 6 3 3 8, 2 3 5 2 5, 2 6 4 3 8, 7 4 8 1 3, 8 8 6 8 7, 3 2 6 1 5 }; 我想创建一个新矩阵,其中包含x中每列的最高k值。例如,如果k=3,我希望结果矩阵包含: 8 8 8 8 8 7 6 6 3 8 7 6 6 3 7 因为,例如,x的第一列中最大的3个数字是8、7和7 我尝试使用函数来解决这个问题,但没有成功

我在SAS/IML中有一个矩阵:

x = {7 6 3 3 8,
     2 3 5 2 5,
     2 6 4 3 8,
     7 4 8 1 3,
     8 8 6 8 7,
     3 2 6 1 5 };
我想创建一个新矩阵,其中包含
x
中每列的最高k值。例如,如果k=3,我希望结果矩阵包含:

8  8  8  8  8 
7  6  6  3  8
7  6  6  3  7
因为,例如,
x
的第一列中最大的3个数字是8、7和7


我尝试使用函数来解决这个问题,但没有成功。

我给出了一个部分答案:

k = 3;
tops = j(k,ncol(x),0);
do c=1 to ncol(x);   
    r = rank(x[,c]);
    h=loc(r>=nrow(x)-k+1);
    tops[,c] = x[,c][h];
end;

这种方法使用循环,我希望避免这种情况,所以如果可能,请发布改进

您的代码看起来不错。这里有一个小修订:

do c=1 to ncol(x);   
    r = rank(x[,c]);
    y = x[loc(r>=nrow(x)-k+1), c];
    call sort(y);
    tops[,c] = y;
end;
至于避免循环以加快速度,这是没有必要的。即使有10000列,这段代码也能在几分之一秒内运行。尝试运行以下计时代码:

x = j(500, 10000);
call randgen(x,"normal");
k = 3;
t0=time();
tops = j(k,ncol(x),0);
do c=1 to ncol(x);   
    r = rank(x[,c]);
    y = x[loc(r>=nrow(x)-k+1), c];
    call sort(y);
    tops[,c] = y;
end;
t=time()-t0;
print t;

另外,这并没有对结果进行排序,我想这样做。太好了,谢谢Rick!请注意(对于其他用户):在SAS 9.22之前,您需要使用
sort(y,1)
而不仅仅是
sort(y)