循环遍历所有变量

时间:2014-01-23 22:02:59

标签: sas

我最近刚开始在这里学习SAS,并且很好地掌握了基础知识,但是对于某些与我目前的知识领域之外的东西有疑问。有没有人碰巧知道循环浏览SAS数据集中所有变量的方法?我知道如何在范围(x1-x99)中的变量上运行do循环/数组,但理想情况下想要查看每个变量而不必重命名任何变量。基本上,我希望在当前值='True'/'False'时运行数据集并更改变量值。我的猜测是我需要在某处使用proc内容,但不确定如何正确使用它。任何提示/见解将不胜感激。谢谢!

2 个答案:

答案 0 :(得分:4)

您可以创建一组非类似命名的变量。虽然您也可以使用包含基本相同信息的PROC CONTENTSdictionary.columns,但您可以使用sashelp.vcolumn走在正确的轨道上。

proc sql;
select name into :collist separated by ' ' 
from dictionary.columns
where memname='DATASETNAME' and libname='LIBNAME' and <other criteria>;
quit;

变量必须是所有相同的类型(字符/数字),因此您可能希望在查询中包含变量类型的标准,以及您可能需要的任何其他限制因素。

这将在您可以在数组中使用的宏变量中创建一个列表&amp; collist。

array vars &collist.;

现在你可以遍历数组了。

如果所有变量都是同一类型,并且您知道订单已修复,您也可以作弊。双短划线列表(x1 - x99)是'变量顺序,所有变量从x1到x99'并且不需要数字后缀或类似的东西。

最后,您也可以在PROC FORMAT中编写一种格式来完成您的需要,具体取决于您打算做什么(将TRUE映射为1,将FALSE映射为0或类似的东西)。 / p>

答案 1 :(得分:1)

添加到Joe的答案:您可以克服所有变量应该属于同一类型的要求。为此,您可以使用宏循环而不是数组。首先,您需要定义宏:

%macro loop;
    %do i=1 %to %sysfunc(countw(&collist));
      ....
      <here goes your code for changing values, where instead of a variable name 
       you use macro function %scan(&collist,&i)>
      ....
    %end;
%mend loop;

现在您可以将%loop粘贴到您要处理所有变量的DATA步骤中。