0

在 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 中提取 colnames,因为它是由一段很长的代码定义的(不像示例中那样),并且名称向量不可用。

提前致谢,

亚历克斯

解决了

感谢您的解决方案。

4

1 回答 1

0

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

于 2014-12-08T19:48:21.507 回答