从SAS中的矩阵计算订单统计信息
我在SAS/IML中有一个矩阵:从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 我尝试使用函数来解决这个问题,但没有成功
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)
。