标记一个数据集中的变量与另一个数据集的值?

时间:2016-09-02 18:54:09

标签: sas

如何获取元数据数据集中包含的标签并将其应用于set1数据集中的变量?

期望的结果是' set1'仍然包含变量a-h,适当的变量现在有标签。例如' set1'将继续有一个变量' a'没有标签,但是变量' b'现在将有标签' Label1'等

我下面的代码有效,但效率非常低,因为它为每个变量运行宏。因此,对于每个标签,它必须阅读' set1',应用标签并保存' set1'。当使用大型的set1'和元数据'数据集,它很慢。

/**********************************************************
Reads metadata - in the real case it comes from a large 
csv file
***********************************************************/
data metadata;
input var $ labels $;
datalines;
b Label1
d Label2
f Label3
;
run;

/**********************************************************
Reads 'set1' in the real case it comes from many 
even larger csv files.
***********************************************************/
data set1;
input a b c d e f g h;
datalines;
1 1 0 5 6 4 0 4
2 3 4 5 3 5 0 1
3 2 1 9 6 5 8 1
;
run;

/**********************************************************
Macro to relabel one by one
***********************************************************/
%Macro relabel(var,label);
DATA set1;
    set set1;
    label %quote(&var) = %quote(&label);
RUN;
%Mend relabel;

/**********************************************************
Steps through 'metadata' and individually calls the macro
for each obs
***********************************************************/
data _null_;
    set metadata;
    call execute('%relabel('||var||','||labels||')');
run;

proc print;
run;

/**********************************************************
Shows labels applied correctly.
***********************************************************/
proc contents;
run;

1 个答案:

答案 0 :(得分:1)

如果您的元数据足够小,那么您可以使用宏变量来保存它。宏变量的大小有65K的限制。

proc sql noprint;
  select catx('=',var,quote(trim(labels))) 
    into :labels separated by ' '
    from metadata
  ;
quit;

proc datasets nolist lib=work ;
  modify set1;
  label &labels;
  run;
quit;