如何在 SAS 数组中使用 LABEL 语句?有可能吗?
How to use LABEL statement in SAS Arrays? Is it even possible?
我正在尝试使用 Tranwrd 函数从多个变量的标签中删除标准文本(“:冒号”)。所以我用了数组。但它不起作用。我在某处读到 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 =.
我明白了,另一种方法是创建所需变量的宏变量并使用 proc 数据集。但我很想知道为什么这不起作用。
谢谢。
您不能在标签语句中使用数组,但您可以使用 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 技术支持。
ARRAY 是一种在 运行 时间 通过变量列表的索引动态引用变量的方法。
在数据步骤设置期间尝试使用它来引用变量没有多大意义。当然不值得为修改 SAS 语言的语法来支持它而进行开发工作。
我正在尝试使用 Tranwrd 函数从多个变量的标签中删除标准文本(“:冒号”)。所以我用了数组。但它不起作用。我在某处读到 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 =.
我明白了,另一种方法是创建所需变量的宏变量并使用 proc 数据集。但我很想知道为什么这不起作用。
谢谢。
您不能在标签语句中使用数组,但您可以使用 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 技术支持。
ARRAY 是一种在 运行 时间 通过变量列表的索引动态引用变量的方法。
在数据步骤设置期间尝试使用它来引用变量没有多大意义。当然不值得为修改 SAS 语言的语法来支持它而进行开发工作。