【发布时间】:2015-03-06 10:03:54
【问题描述】:
在 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
有什么想法吗?
EDIT2
函数value解决EDIT1中的symget问题
mydataNew = value(symget('mydataX'));
print (&mydataX);
print (value(symget("mydataX")));
print mydataNew;
mattrib 问题仍然存在。
已解决
感谢 Rick,你让我看到了 CALL EXECUTE() 语句。
【问题讨论】:
标签: macros sas-iml string-to-symbol