1

我想知道是否可以使用 IML 按行选择 5 个最小值或最大值?

这是我的代码:

Proc iml ;
  use table;
  read all var {&varlist} into matrix ; 

n=nrow(matrix) ; /* n=369 here*/
p=ncol(matrix);  /* p=38 here*/

test=J(n,5,.) ; 

Do i=1 to n ;
    test[i,1]=MIN(taux[i,]);
End;
Quit ;

所以我想获得一个矩阵测试,其中包含第 1 列的最大最小值,然后第 2 列包含我的行的最小值,除了第 1 值等...

如果你有任何想法!:) 事件,如果它不使用 IML(但使用 SAS:base,sql..)

例如:

    Data test;                                                                                                                input x1-x10 ;                                                                                                              cards;     
1 9 8 7 3 4 2 6
9 3 2 1 4 7 12 -2
;run;

我想获得按行排序的结果:

1 2 3 4 6 7 8 9
-2  1 2 3 4 7 12

为了在另一个表中选择我的 5 个最小值:

y1 y2 y3 y4 y5
1  2 3 4  6
-2 1 2 3 4
4

2 回答 2

1

您可以call sort()在 PROC IML 中使用对列进行排序。因为要分离列而不是对整个矩阵进行排序,所以提取列,对其进行排序,然后更新原始列。

您想对行进行排序,因此转置矩阵,进行排序,然后转回。

proc iml;

have = {1 9 8 7 3 4 2 6,
9 3 2 1 4 7 12 -2};

print have;

n = nrow(have);

have = have`; /*Transpose because sort works on columns*/

do i=1 to n;
    tmp = have[,i];
    call sort(tmp,1);
    have[,i]=tmp;
end;

have = have`;

want = have[,1:5];
print want;
quit;
于 2015-02-04T15:41:50.670 回答
1

阅读文章“计算 SAS 中的第 k 个最小数据值” 按照文章中的方式定义模块。然后使用以下内容:

have = {1 9 8 7 3 4 2 6,
        9 3 2 1 4 7 12 -2};
x = have`;    /* transpose */

ord = j(5,ncol(x));
do j = 1 to ncol(x);
   ord[,j] = ordinal(1:5, x[,j]);
end;
print ord;

如果您的数据中有缺失值并想要排除它们,请使用 SMALLEST 模块而不是 ORDINAL 模块。

于 2015-02-05T13:07:37.853 回答