为 SAS 数据集分配 Excel 标签

问题描述 投票:0回答:1

我有一个包含大约 250 个变量的 SAS 数据集,我想将两列(“变量”和“标签”)Excel 文件中的标签分配给每个变量。显然,手动输入每个标签是不切实际的...

Excel文件是这样的(有些标签很长,>100个字符):

变量 标签
变量1 标签1
变量2 标签2
变量3 标签3

SAS数据集与excel文件具有相同的变量。

导入 Excel 文件并将其转换为临时 SAS 数据集后,我尝试创建一个宏以动态地将每个标签应用于每个变量。有些变量是数字,有些是字符,所以我尝试单独处理它们:

data dataset_labeled;
    set dataset1;

    /* Dynamically assign labels using metadata */
    if _n_ = 1 then do;
        declare hash lbl();
        lbl.definekey("Variable");
        lbl.definedata("Label");
        lbl.definedone();

        /* Standardize Variable names in metadata to uppercase */
        do until (eof);
            set mims3_spect_labels end=eof;
            Variable = upcase(Variable);
            lbl.add();
        end;
    end;

    /* Separate arrays for numeric and character variables */
    array num_vars _numeric_; /* Array for all numeric variables */
    array char_vars _character_; /* Array for all character variables */

    /* Apply labels to numeric variables */
    do i = 1 to dim(num_vars);
        if lbl.find(key: upcase(vname(num_vars[i]))) ne 0 then Label = "No Label";
        call label(num_vars[i], Label);
    end;

    /* Apply labels to character variables */
    do i = 1 to dim(char_vars);
        if lbl.find(key: upcase(vname(char_vars[i]))) ne 0 then Label = "No Label";
        call label(char_vars[i], Label);
    end;

run;

proc contents data=dataset_labeled;
run;

但是当我运行过程内容时,没有任何标签显示。我该如何解决这个问题?

提前致谢!

excel sas sas-macro
1个回答
0
投票

您必须生成实际的 LABEL 语句才能作为代码运行。最简单的方法是将它们写入文本文件,然后使用 %INCLUDE 在正确的位置运行生成的代码。

因此,如果您已将标签信息读入名为 mims3_spect_labels 的数据集,其中变量名为 VARIABLE 和 LABEL,那么您可以使用如下数据步骤创建 LABEL 语句:

filename code temp;
data _null_;
  set mims3_spect_labels end=eof;
  file code;
  if _n_=1 then put 'label';
  put variable '=' label :$quote. ;
  if eof then put ';' ;
run;

现在您可以在 DATA 步骤或 PROC MODIFY 步骤中使用该语句将标签附加到变量。 因此,假设您的意图是使用来自 dataset1 的数据并附加标签来创建一个名为 dataset_labeled 的新数据集,那么您可以运行此数据步骤。

data dataset_labeled;
  set dataset1;
%include code / source2;
run;

请注意,变量的 TYPE 对于 LABEL 语句并不重要。

如果您的问题是您的变量/标签对多于数据集中存在的变量/标签对,那么首先使用您需要的变量创建一个子集。因此,获取数据集中的变量列表。

proc contents data=dataset1 noprint out=contents; run;

然后将其与元数据中的变量列表相结合。

proc sql;
  create table labels as select a.* 
   from mims3_spect_labels a
   where upcase(variable) in 
     (select upcase(name) from contents)
  ;
quit;

并使用该 LABELS 数据集来生成 LABEL 语句。

© www.soinside.com 2019 - 2024. All rights reserved.