如何在SAS阵列中使用LABEL语句?这可能吗?

  • 本文关键字:语句 LABEL SAS 阵列 sas
  • 更新时间 :
  • 英文 :


我试图使用Tranwrd函数从多个变量的标签中删除标准文本(": Colon")。所以我用了数组。但这行不通。我在某个地方读到LABEL语句必须列出一个实际的变量名。但我不确定。下面是示例代码:

data test;
CG1DF=1;
CG2DF=2;
CG3DF=3;
CG4DF=4;
CG5DF=5;
label CG1DF="Sample1 :Colon"
CG2DF="Sample2 :Colon"
CG3DF="Sample3 :Colon"
CG4DF="Sample4 :Colon"
CG5DF="Sample5 :Colon";
run;

proc report data=test; run;

data final;
set test;
/*label CG1DF=tranwrd(vlabel(CG1DF),": Colon","");*/
array CG(*) CG1DF CG2DF CG3DF CG4DF CG5DF;
do i=1 to dim(CG);
label CG(i)=tranwrd(vlabel(CG(i)),": Colon","");
end;
run;
It throws this error:
33          label CG(i)=tranwrd(vlabel(CG(i)),": Colon","");
_
73
76
ERROR 73-322: Expecting an =.

我明白了,其他方法是创建所需变量的宏变量并使用过程数据集。但我很想知道为什么这不起作用。

谢谢。

ARRAY是在运行时动态引用变量的方法通过索引到变量列表

试图在数据步长设置期间使用它来引用变量是没有多大意义的。当然不值得开发人员修改SAS语言的语法来支持它。

不能在标签语句中使用数组,但可以使用SQL构建标签语句并将其保存到单个宏变量中:

proc sql noprint;
select cats(name, '=', '"', tranwrd(label," :Colon",""), '"')
into :labels separated by ' '
from dictionary.columns
where    libname = 'WORK'
AND memname = 'TEST'
AND name LIKE 'CG%DF'
;
quit;

创建以下宏变量&labels.:

CG1DF="Sample1" CG2DF="Sample2" CG3DF="Sample3" CG4DF="Sample4" CG5DF="Sample5"

你可以使用你选择的方法来应用它。

data final;
set test;
label &labels.;
run;

或:

proc datasets lib=work nolist;
modify test;
&labels.;
quit;
至于为什么,你的猜想和我的一样好。由于它是一个非常广泛的语句,几乎可以在任何PROC或DATA步骤中使用,我的猜测是,它不支持数组,完全不兼容所有不同的方式和地方,它可以使用。如果你认为它非常有价值,我建议你把它作为一个特性请求提交给SAS技术支持。

最新更新