在 IML 过程中,我有几个矩阵和几个带有列名的向量:
proc IML;
mydata1 = {1 2 3, 2 3 4};
mydata2 = {1 2, 2 3};
names1 = {'red' 'green' 'blue'};
names2 = {'black' 'white'};
要将列名分配给矩阵中的列,可以复制粘贴 mattrib 语句足够多次:
/* mattrib mydata1 colname=names1;*/
/* mattrib mydata2 colname=names2;*/
但是,在我的情况下,矩阵的数量是在执行时定义的,因此需要一个 do 循环。以下代码
varNumb=2;
do idx=1 to varNumb;
call symputx ('mydataX', cat('mydata',idx));
call symputx ('namesX', cat('names',idx));
mattrib (symget('mydataX')) colname=(symget('namesX'));
end;
print (mydata1[,'red']) (mydata2[,'white']);
quit;
但是在第一个 symget 上产生“期望名称”错误。
类似的问题Loop over names in SAS-IML? 使用 symget 提供宏解决方法,这里会产生错误。
将 mattrib 与 symget 一起使用的正确方法是什么?除了宏,还有其他方法可以从字符串中生成变量吗?
任何帮助,将不胜感激。
谢谢,亚历克斯
编辑1
问题出在symget函数中。&符号解析宏变量中包含的矩阵的名称,symget只返回宏的名称。
proc IML;
mydata1 = {1 2 3};
call symputx ('mydataX', 'mydata1');
mydataNew = (symget('mydataX'));
print (&mydataX);
print (symget("mydataX"));
print mydataNew;
quit;
结果是
mydata1 :
1 2 3
mydata1
mydataNew :
mydata1
有任何想法吗?
编辑2
函数值解决EDIT1中的symget问题
mydataNew = value(symget('mydataX'));
print (&mydataX);
print (value(symget("mydataX")));
print mydataNew;
mattrib问题但仍然存在。
解决了
谢谢 Rick,你让我看到了 CALL EXECUTE() 语句。