填充矩阵proc iml SAS

时间:2014-09-24 13:03:03

标签: sas sas-iml

我有一个带有两列(c1,c2)的x矩阵。我想修复第一列(c1),添加10列,每列的值为C2 + m,C2 + m ... C2 + m到X矩阵,m是随机整数。最后矩阵将是:

C1,C2 + m,C2 + m,C2 + m ... C2 + m;

CODE:

proc iml;

use nonpar;

read all var{treat response} into x;

do i=1 to 10;

call randseed(123);

call randgen(u, "Uniform");

Max = 300; Min = 68;

m = min + floor( (1+Max-Min)*u );

x = x[,1]||x[,2]+m;

end;

quit;

有人可以帮我解决这个问题吗 感谢

1 个答案:

答案 0 :(得分:1)

应该引导你朝着正确的方向前进。

首先,预先创建完整的目标矩阵;不要经常连接。因此,一旦您将数据集读入x,请创建另一个x_new,其行数与x相同,但有11列。 j会为你做这件事。

其次,您可以同时制作所有随机数,但必须先使用j定义要填充的矩阵的大小。这假设你想要10个列和每个行中的每一个都有一个新的随机整数;如果你只想要每一行或只需要一个'm',你需要以不同的方式做到这一点,但你需要澄清这一点。如果您只想要一行10 m,那么您可以先执行此操作(生成一个包含10列1行的u),然后使用矩阵乘法将其扩展为x的完整行数。

以下是使用SASHELP.CLASS的简化示例,显示了这两个概念。

proc iml;
  use sashelp.class;
  read all var {age weight} into x;
  x_new = j(nrow(x),11);  *making the new matrix with lots of columns;
  x_new[,1] = x[,1];      *copy in column 1;
  call randseed(123); 
  u = j(nrow(x),10);      *make the to be filled random matrix;
  call randgen(u,'Uniform',68,300); *the min/max parameters can go here;
  u = floor(u+0.5);  *as Rick noted in comments, needed to get the max value properly;
  x_new[,2:11] = u[,1:10] + x[,2]; *populate x_new here;
  print x_new;
quit;