在用户定义的模块中按列名访问矩阵列

时间:2014-12-08 10:16:30

标签: matrix module user-defined columnname sas-iml

在IML程序中,我有一个带有命名列的矩阵。

proc iml;
    myMatrix = {1 2 3, 1 4 9};
    mattrib myMatrix colname={"a", "b", "c"};
    print myMatrix;
    print (myMatrix[,"a"]);

/*  load module = myModule;*/
/*  run myModule(myMatrix);*/
run;

我可以轻松地按名称访问和打印列。但是,当我将矩阵传递给用户定义的模块时,模块内的列名称消失(运行模块取消注释先前proc iml中的行)

proc iml;
    start myModule(MatrixWithHeader);
        print MatrixWithHeader;
        print (MatrixWithHeader[,"a"]);
    finish myModule;
    store module=myModule;
run;

我收到以下错误:

ERROR: (execution) Character argument should be numeric.

如何通过名称访问模块中的矩阵列?

按列号访问将使代码不灵活。可能的解决方法可能是将列名称的向量作为参数传递,并在模块内运行mattrib。但是,重复mattrib是很麻烦的,在这种情况下,我需要从myMatrix中提取类名,因为它是由一长段代码定义的(不像示例),并且名称向量不可用。

提前致谢,

亚历

解决

感谢您的解决方案。

1 个答案:

答案 0 :(得分:0)

我认为唯一的解决方案是使用GLOBAL clause并访问具有属性的原始矩阵。即使SAS / IML通过引用传递参数,它也不会保留MATTRIB赋值(就像你,我最近才注意到这一点。)此外,没有函数可以调用来返回矩阵属性(特别是列名) ),因此您无法从矩阵中提取列名称,然后将名称作为另一个参数传递给模块。