SAS - 从宏变量创建变量

时间:2013-03-17 17:13:23

标签: sas sas-macro

我有一个SAS数据集,它有20个字符变量,所有这些都是名字(例如Adam,Bob,Cathy等)。

我想要一个动态代码来创建名为Adam_ref,Bob_ref等的变量。即使有不同名称的不同数据集(即不想手动定义每个变量),它也会起作用。

到目前为止,我的方法是使用proc内容获取所有变量名,然后使用宏来创建宏变量Adam_ref,Bob_ref等。

如何在此处创建数据集中的实际变量?我需要一种不同的方法吗?

proc contents data=work.names 
               out=contents noprint;
run;

proc sort data = contents; by varnum; run;

data contents1;
  set contents;
  Name_Ref = compress(Name||"_Ref");
  call symput (NAME, NAME_Ref); 
  %put _user_;
run;

3 个答案:

答案 0 :(得分:1)

如果你想创建一个空数据集,其中的变量名称类似于宏变量中的某些值,你可以这样做。

将值保存到由某些模式命名的宏变量中,例如v1v2 ......

proc sql;
select compress(Name||"_Ref") into :v1-:v20 from contents;
quit;

如果您不知道有多少值,您必须先计算它们,我假设它们只有20个。

然后,如果所有变量都是长度为100的字符变量,则可以创建如下数据集:

%macro create_dataset;
data want;
length %do i=1 %to 20; &&v&i $100 %end;
;
stop;
run;
%mend;

%create_dataset; run; 

如果你在宏变量中有值,你可以这样做,一般来说可能有更好的方法。

如果您不想创建空数据集但只想更改变量名称,可以这样做:

proc sql;
select name into :v1-:v20 from contents;
quit;

%macro rename_dataset;
data new_names;
set have(rename=(%do i=1 %to 20; &&v&i = &&v&i.._ref %end;));
run;
%mend;

%rename_dataset; run;

答案 1 :(得分:1)

您可以将PROC TRANSPOSE与ID语句一起使用。

此步骤创建一个示例数据集:

data names;
    harry="sally";
    dick="gordon";
    joe="schmoe";
run;

此步骤基本上是您上一步的副本,它会生成列名称的数据集。我将在整个过程中重用数据集namerefs。

proc contents data=names out=namerefs noprint;
run;

此步骤将“_Refs”添加到之前定义的名称并删除其他所有名称。变量“name”来自PROC CONTENTS输出的数据集的列属性。

data namerefs;
    set namerefs (keep=name);
    name=compress(name||"_Ref");
run;

此步骤生成包含所需列的空数据集。通过查看列属性再次获得变量“ name ”。如果您尝试查看数据集,可能会在GUI中收到无害警告,但您可以根据需要使用它,并且可以确认它具有所需的输出。

proc transpose out=namerefs(drop=_name_) data=namerefs;
  id name;
run;

答案 2 :(得分:1)

这是另一种需要较少编码的方法。它不需要运行proc内容,不需要知道变量的数量,也不需要创建宏函数。它也可以扩展到做一些额外的事情。

步骤1是使用内置字典视图来获取所需的变量名称。对此的适当视图是dictionary.columns,其别名为sashelp.vcolumn。字典libref只能在proc sql中使用,而sashelp别名可以在任何地方使用。我倾向于使用sashelp别名,因为我在带有DMS的窗口中工作,并且可以始终以交互方式查看sashelp库。

proc sql;
  select compress(Name||"_Ref") into :name_list
                                separated by ' '
    from sashelp.vcolumn
   where libname = 'WORK' 
     and memname = 'NAMES';
quit;

这会产生一个空格分隔的宏,并且具有所需的名称。

步骤2要构建空数据集,那么此代码将起作用:

Data New ;
  length &name_list ;
run ;

您可以通过使用稍微复杂的select语句来避免假设长度或使用新变量名创建填充数据集。

例如

 select compress(Name)||"_Ref $")||compress(put(length,best.)) 
                 into :name_list
                 separated by ' '

将生成一个宏变量,该变量保留每个变量的先前长度。这将不会对上面的第2步进行任何更改。

要创建用于重命名数据集选项的填充数据集,请按如下所示替换select语句:

 select compress(Name)||"= "||compress(_Ref") 
                   into :name_list
                   separated by ' '

然后用以下代码替换Step 2代码:

Data New ;
  set names (rename = ( &name_list)) ;
run ;