3

我第一次尝试使用 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 的值,计算有多少 obs 高于 x 值,有多少低于 x 值,将这些数字记录在数据集中,然后转到 v2、v3、... v10000。最后,我将有一个数据集,该数据集将显示我的 10000 个变量中的每一个变量高于值 x 的 obs 数和低于值 x 的 obs 数。

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

您可以提供的任何帮助或参考将不胜感激。

谢谢。

4

2 回答 2

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 ;
于 2011-07-11T15:27:40.700 回答
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 循环。

于 2011-07-08T03:21:16.673 回答