2016-01-24 119 views
0

我有一个SAS数据集,其中包含一些变量,我希望为它们中的每一个运行PROC TABULATE。我写了一个宏来做这件事,但宏打印变量的名称,而我想打印他们的标签,我不知道如何改变它。我的宏:宏中的SAS变量标签

%macro Frequency(data, variable); 
title2 "Frequency Distribution of &variable"; 
proc tabulate data = &data; 
    class treatment &variable; 
    table (treatment = '' all),(&variable = '' all)*(n*f=8. rowpctn='%'*f=8.1)/box = "Treatment Group/&variable"; 
run; 
title2; 
%mend Frequency; 

的问题是,一些变量有多个单词的标签,我不能得到一个标题aaa_hhh的输出,它必须是正确的AAA HHH。

我的另一个想法是将数据转置为“长”格式,并使用“by”字通过变量运行制表符,但是这也失败了,因为我希望在该框中使用变量名,并且“ByVal1”不支持该选项。你能在这里协助我吗?谢谢。

回答

1

data _null_步骤中使用vlabel提取标签或读取SASHELP.VCOLUMN。

data _null_; 
set &data (obs=1); 
call symputx('var_label', vlabel(&variable)); 
run; 

&put &var_label; 
0

为n个变量调用宏n次看起来很痛苦。这是UNTESTED代码 - 如果您将数据添加到问题中,我将使用您的示例数据进行调试。

显然,您不会针对“治疗”运行“治疗”。也许还有其他变量,你不会真正运行PROC TABULATE。也许还有一个SubjectID变量或一个您不运行的TreatmentDate变量。我假设你会用数据集名称(包括libref,如果适用)以逗号的形式调用宏,然后使用空格分隔的变量列表不包含在Tabulate中。

%MACRO frequency(data,varexclude) ; 

    %* remove extra spaces, just in case ; 
    %LET varexclude = %SYSFUNC(COMPBL(&varexclude)) ; 

    %* swap each remaining space for double-quote comma double-quote ; 
    %LET varexclude = %SYSFUNC(TRANWRD(&varexclude,%STR(),%STR(",")) ; 

    %* Get all the varable names, labels, types, etc ; 

PROC CONTENTS DATA=&data OUT=vlist NOPRINT ; 
RUN ; 

    %* Put the variable names and types into macro variables ; 

PROC SQL ; 
    SELECT name, label 
    INTO :varlist SEPARATED BY '|', 
     :lablist SEPARATED BY '|' 
    FROM vlist 
    WHERE UPCASE(name) NOT IN (%UPCASE("&varexclude")) 
     AND type EQ 1 
    ; %* type EQ 1 means numeric. If you want TABULATE on character, too, remove that part of the WHERE clause ; 

    %* how many tabulates will we run ? ; 
    %LET numvars = &SQLOBS ; 
QUIT ; 

    %DO i = 1 %TO &numvars ; 

title2 "Frequency Distribution of %SCAN(&lablist,&i,|)"; 
proc tabulate data = &data; 
    class treatment %SCAN(&varlist,&i,|); 
    table (treatment = '' all),(%SCAN(&varlist,&i,|) = '' all)*(n*f=8. rowpctn='%'*f=8.1)/box = "Treatment Group/%SCAN(&lablist,&i,|)"; 
run; 

    %END ; 
%MEND 
1

这里是微距功能可以让你提取标签:

%macro getVarLabel(ds=sashelp.class /* two level ds name */ 
     , var= /* variable name for which to return the label */ 
    ); 
    %local dsid vnum vlabel rc; 
    /* Open dataset */ 
    %let dsid = %sysfunc(open(&ds)); 
    %if &dsid > 0 %then %do; 
    /* Get variable number */ 
    %let vnum = %sysfunc(varnum(&dsid, &var)); 
    %if(&vnum. > 0) %then 
     /* Variable exists, so get label */ 
     %let vlabel = %sysfunc(varlabel(&dsid, &vnum)); 
    %else %do; 
     %put NOTE: Variable &var does not exist in &ds; 
     %let vlabel = %str(); 
    %end; 
    %end; 
    %else %put dataset &ds not opened! (rc=&dsid); 

    /* Close dataset */ 
    %let rc = %sysfunc(close(&dsid)); 

    /* Return variable label */ 
    &vlabel 

%mend; 

然后,您可以直接在标题声明称此:

title2 "Frequency Distribution of %getVarLabel(ds=&data,var=&variable)";