如何在 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 语言的语法来支持它而进行开发工作。