我有一个包含大约 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;
但是当我运行过程内容时,没有任何标签显示。我该如何解决这个问题?
提前致谢!
您必须生成实际的 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 语句。