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

时间:2012-06-29 14:10:24

标签: 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。

我尝试使用 rank 功能来弄清楚如何做到这一点。

2 个答案:

答案 0 :(得分:2)

您的代码看起来很好。这是一个小修改:

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;

至于避免循环使其更快,这是没有必要的。即使有10,000列,这段代码也会在几分之一秒内完成。尝试运行以下计时代码:

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;

答案 1 :(得分:0)

这是我提出的部分答案:

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;

这种方法使用了一个我想避免的循环,所以请尽可能发布改进!