将SAS数据集的标签设置为等于其变量名称

时间:2014-12-31 15:52:34

标签: sas

我正在处理一个相当大的数据集,这些数据集作为CSV文件提供给我。当我尝试导入其中一个文件时数据会很好但是,文件中的变量数量对于SAS来说太大了,所以它停止读取变量名称并开始为它们分配序列号。为了保持变量名称不在数据集中,我在文件中读取数据行从1开始,因此它没有将第一行读作变量名 -

proc import file="X:\xxx\xxx\xxx\Extract\Live\Live.xlsx" out=raw_names dbms=xlsx replace;
    SHEET="live";
    GETNAMES=no;
    DATAROW=1;
run;

然后我运行一个宏来开始分解数据集并根据每个变量中的第一个观察值重命名变量 -

%macro raw_sas_datasets(lib,output,start,end);
    data raw_names2;
        raw_names;
            if _n_ ne 1 then delete;
            keep A -- E &start. -- &end.;
    run;
    proc transpose data=raw_names2 out=raw_names2;
        var A -- &end.;
    run;
    data raw_names2;
        set raw_names2;
            col1=compress(col1);
    run;
    data raw_values;
        set raw;
            keep A -- E &start. -- &end.;
    run;
    %macro rename(old,new);
        data raw_values;
            set raw_values;
                rename &old.=&new.;
        run;
    %mend rename;
    data _null_;
        set raw_names2;
            call execute('%rename('||_name_||","||col1||")");
    run;
    %macro freq(var);
        proc freq data=raw_values noprint;
           tables &var. / out=&var.;
        run;
    %mend freq;
     data raw_names3;
        set raw_names2;
            if _n_ < 6 then delete;
     run;
    data _null_;
        set raw_names3;
           call execute('%freq('||col1||")");
    run;
    proc sort data=raw_values;
        by StudySubjectID;
    run;
    data &lib..&output.;
        set raw_values;
    run;
%mend raw_sas_datasets;

我遇到的问题是变量名称现在都已正确设置且数据排列正确,但标签仍然是原始SAS分配的序号。有没有办法将所有标签设置为等于变量名?

2 个答案:

答案 0 :(得分:2)

在图书馆中,sashelp是一个表格vcolumn。 vcolumn按表包含每个库的变量的所有名称。您可以编写一个宏,将所有变量名称放入宏变量,然后从那里设置标签。

这是我放在一起的一些代码(不是很漂亮),但它可以满足您的需求:

data test.label_var;
x=1;
y=1;
label x = 'xx';
label y = 'yy';
run;

proc sql noprint;
     select count(*) into: cnt
            from sashelp.vcolumn
                 where memname = 'LABEL_VAR';quit;
%let cnt = &cnt;

proc sql noprint;
     select name into: name1 - :name&cnt
            from sashelp.vcolumn
                 where memname = 'LABEL_VAR';quit;

%macro test;

   %do i = 1 %to &cnt;

       proc datasets library=test nolist;

            modify label_var;

            label &&name&i=&&name&i;

       quit;

  %end;
%mend test;
%test;

答案 1 :(得分:2)

如果您只想删除变量标签(此时它们默认为变量名称),那很容易。来自SAS Documentation

proc datasets lib=&lib.;
  modify &output.;
  attrib _all_ label=' ';
run;

我怀疑你有一个比上面更简单的解决方案。

  • 实际的重命名步骤需要以不同方式完成。现在它一遍又一遍地重写整个数据集 - 对于很多变量而言,这是一个糟糕的想法。将重命名语句全部放入一个datastep,或转换为PROC DATASETS或其他内容。查看“list processing SAS”以获取有关如何执行此操作的详细信息;在这个网站或谷歌上你会找到很多解决方案。

  • 您可能会让SAS阅读整个第一行。变量的数量不是问题;它可能是线的长度。如果我能在几个月前在这个网站上处理这个确切的问题,我会发现另一个问题。

  • 我首选的选择是不要使用PROC IMPORT for CSVs;我建议编写一个元数据表来存储变量的变量名和长度/类型,然后使用它来编写导入代码。一开始要多做一些工作,但每次学习只需要做一次,你保证PROC​​ IMPORT不会为你做出愚蠢的决定。

相关问题