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

如何使SAS宏通过变量/列运行?,sas,sas-macro,Sas,Sas Macro,我第一次尝试SAS宏。我的基本问题是:我有一个包含大约10000个变量的数据集。我需要分别获取每一列,创建一个新的条件变量,存储结果,然后移动到下一列。这些列不是按顺序排列的。SAS用于标识列的语法是什么(类似于“\u N\u”如何标识行) 这里有更多的信息。 数据如下所示: 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 ...

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

这里有更多的信息。 数据如下所示:

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的值,计算有多少OB高于值x,有多少OB低于值x,将这些数字记录在数据集中,然后移动到v2,v3。。。v10000。最后,我将有一个数据集,它将显示10000个变量中每个变量的值x以上OB数和值x以下OB数

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

如果您能提供任何帮助或推荐,我们将不胜感激


谢谢。

这不是最有效的方法,但这将为您提供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循环。

好的,更勤奋的研究让我先使用数组,然后使用proc means。宏甚至没有必要。我的问题一定不清楚——我想要一个数据集,而不是很多。但你是对的,数组就是答案。我只是不知道这个术语!现在我知道了。:-)非常感谢您的回复。谢谢!真漂亮。我使用了“doover”并设置了一个二进制变量,然后将其相加。萨曼莎:我知道这已经晚了大约4年,但如果我没有弄错的话,
do over
不赞成这种方法。仅供参考。@Alex:谢谢!谢谢你提供的额外信息。
%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 ;