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

将SAS数据集的标签设置为其变量名,sas,Sas,我正在处理一个相当大的数据集,这些数据集作为CSV文件提供给我。当我尝试导入其中一个文件时,数据将很好地输入,但是文件中的变量数量对于SAS来说太大,因此它停止读取变量名称,并开始为它们分配序列号。为了保持变量名不在数据集中,我在文件中读取了从1开始的数据行,因此它没有将第一行作为变量名读取- proc import file="X:\xxx\xxx\xxx\Extract\Live\Live.xlsx" out=raw_names dbms=xlsx replace; SHEET="l

我正在处理一个相当大的数据集,这些数据集作为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分配的序列号。有没有办法将所有标签设置为变量名?

库中的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;
如果您只想删除默认为变量名的变量标签,这很容易。从:

不过,我怀疑您有一个比上述更简单的解决方案

实际的重命名步骤需要以不同的方式进行。现在它一次又一次地重写整个数据集——对于许多变量来说,这是一个糟糕的想法。将重命名语句全部放入一个datastep、一个PROC数据集或其他内容中。查看“列表处理SA”,了解如何执行该操作的详细信息;在这个网站或谷歌上,你会发现很多解决方案

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

我的首选选项是无论如何不要对CSV使用PROC导入;我建议编写一个元数据表来存储变量名和变量的长度/类型,然后使用它来编写导入代码。一开始需要多做一点工作,但每次研究只需做一次,您可以保证PROC IMPORT不会为您做出愚蠢的决定


很可能变量的数量对于SAS来说不是太多,我从来没有见过这样的情况,但是对于LRECL来说,带有变量名的行太长了。我还希望您没有使用XLSX。您应该直接导入CSV,而不是使用XLSX作为中介,这会导致变量数量的问题。为什么不将proc数据集和quit语句放在宏循环之外?如果您使用的是select into,为什么不将标签代码本身选择为单个字符串?例如,选择catx“”,“标签”,名称,“=”,名称,;”into:labellist,由“”和…分隔,或者制作一个小宏并选择对该宏的调用。这样你就不必做一个无用的宏,也不用担心循环。。。
proc datasets lib=&lib.;
  modify &output.;
  attrib _all_ label=' ';
run;