2014-01-23 113 views
1

我最近在这里开始学习SAS,并且基本能够很好地完成,但是在我目前的知识领域之外有一些问题。有人碰巧知道在SAS数据集中循环所有变量的方法吗?我知道如何在范围(x1-x99)中的变量上运行do循环/数组,但理想情况下希望查看每个变量而不必重命名任何变量。基本上,我正在寻找运行数据集并在当前值='True'/'False'时更改变量值。我的猜测是,我需要在这里使用proc内容,但并不确定如何正确使用它。任何提示/见解将不胜感激。谢谢!骑自行车穿过所有变量

回答

4

您可以创建一个非相似命名变量的数组。尽管您也可以使用dictionary.columnssashelp.vcolumn,它们基本上包含相同的信息,但它们的编号为PROC CONTENTS

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

的变量必须具有相同的类型(字符/数字),所以你可能要包括的变量类型的查询的标准,再加上你可能需要的任何其他限制因素。

这将创建一个列表,& collist,在宏变量您可以在阵列

array vars &collist.; 

在使用,现在你可以循环阵列上。

如果所有变量都是相同类型,并且您知道订单是固定的,那么您也可以作弊。双破折号列表(x1 - x99)是'可变顺序,所有变量从x1到x99',并且不需要数字后缀或类似的东西。

最后,你也可以写一个PROC FORMAT的格式来完成你所需要的操作,具体取决于你打算做什么(映射TRUE为1,FALSE为0或类似的东西)。

+0

谢谢你们,我很抱歉迟到的回应。星期一我得玩这个。无论什么原因,当我运行Proc SQL时,它都会在日志中说没有行被选中。最后我需要额外的标准才能运作吗?我想要选择collist中的所有变量,而不仅仅是感兴趣的变量。实际上,您使用非常相似的代码帮助我解决了之前的问题,但最终还是包含了其他条件。该代码在这个相同的数据集上工作正常,但是当我排除该条件时,它说没有行被选中。 – photec

+0

如果没有行被选中,那么您需要*更少*或*不同*条件。更多只会进一步限制(可能需要,也可能不需要,这取决于你的情况)。 DATASETNAME和LIBNAME当然是您实际值的占位符。 – Joe

1

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

%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数据步你要去的地方处理所有变量。

+1

尽管技术上可行,但我认为这是糟糕的编程。不仅非常罕见,您将拥有相同的代码来执行数字和字符变量,但是如果您确实可以创建两个比这更清晰的数组。 – Joe

相关问题