我有一个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;
答案 0 :(得分:1)
如果你想创建一个空数据集,其中的变量名称类似于宏变量中的某些值,你可以这样做。
将值保存到由某些模式命名的宏变量中,例如v1
,v2
......
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 ;