如何使SAS宏运行变量/列?

时间:2011-07-07 22:10:51

标签: sas sas-macro

我第一次尝试使用SAS宏。我的基本问题是:我有一个包含10000个变量的数据集。我需要单独获取每个列,创建一个新的条件变量,存储结果,然后移动到下一列。这些列不按顺序排序。 SAS用于识别列的语法是什么(类似于“ _ N _ ”将如何识别行)?

以下是更多信息。 数据看起来像这样:

ID  v1   v2   v3  ... v10000
01  3.2  1.5  7.8 ...   4.2
02  1.1  4.5  1.9 ...  10.7
..
 N  2.5  1.5  4.9 ...   7.3

我需要查看v1的值,计算值x上方有多少个obs,以及多少个值低于x值,在数据集中记录这些数字,然后转到v2,v3,... v10000。最后,我有一个数据集,可以显示我的10000个变量中每个变量值的x值以及数值低于x的数量。

我编写了代码,因为我会为标准SAS代码中的一个变量编写代码并且它可以工作,现在我的目的是将代码转换为宏代码,但我不知道如何构造一个循环从一列移到下一列。

非常感谢您提供的任何帮助或参考资料。

感谢。

2 个答案:

答案 0 :(得分:3)

%LET CUTOFF = 3.1415926 ; /* set this as your 'cutoff' value */

data counters ;
  set mydata end=eof ;

  array vi{*} v1-v10000 ; /* incoming values */
  array vc{*} c1-c10000 ; /* counters */

  retain vc . ;

  do i = 1 to dim(vi) ;
    if vi{i} >= &CUTOFF then vc{i} + 1 ;
  end ;

  if eof then output ;

  keep c1-c10000 ;
run ;

答案 1 :(得分:0)

不会是最有效的方式,但这将为您提供10000个单独的数据集。

%macro splitdata;
%do i=1 %to 10000;
data v_&i;
   set v;
   array vArray[10000] v1-v10000;
   keep vArray[&i]; 
run;
%end splitdata;

%splitdata;

从那里你可以在每个数据集v_1,v_2,....上使用相同类型的宏do循环。