如何在宏SAS中的循环内访问数组的第n个元素?

时间:2018-06-26 18:35:37

标签: sas

我试图在宏定义的%do循环中获取数组的第i个项,并使用元素名称创建数据集,但是我所能获得的只是“ z1”之类的东西。这就是我的目的到目前为止

%macro print(set,groupvar);
  proc sql ;
  select put(count(distinct &groupvar),1.)
 into :hm
 from &set
 ;


  select distinct set
  into :z1-:z&sysmaxlong
  from &set
  ;
    quit;

  data %do i =1 %to &hm;
        %scan(&z, &i);
       %end;
    ;
%mend;

我也尝试使用z [&i]而不是%scan(&z,&i),但还是没有运气

3 个答案:

答案 0 :(得分:0)

问题:

  1. 您有一个宏变量SET,但是在选择查询中有不同的SET,这是您想要的吗?

    select distinct set
    
  2. 创建宏变量时,无需指定序列的结尾。

    select distinct &set into :z1- from &set; quit;
    
  3. 您创建了一系列宏变量Z1-Zn,但是尝试使用SCAN来检索值吗?它们没有存储在数组中,而是存储在一系列宏变量(例如Z1,Z2等)中。

答案 1 :(得分:0)

output语句无法指定动态目标表。您将需要创建墙纸代码,以根据拆分条件将其输出到适当的表。

您的宏将需要创建宏变量以支持此代码模板

data &out1 &out2 … &outN;
  set input_data;
  select;
    when (&case1) output &out1;
    when (&case2) output &out2;
    …
    when (&caseN) output &outN;
    otherwise;
  end;
run;

一些精巧的SQL可以支持模板

data &outlist;
  set input_data;
  select;
    &whenStatements;
    otherwise;
  end;
run;

哈希对象.output()方法可以指定用于保存哈希内容的动态目标。考虑“将表拆分为名称基于变量值的子表”的情况,又称为“将一个数据集拆分为根据组变量命名的多个数据集”。有些方法需要对数据进行预先分析(如您发布的代码中一样),而其他方法则不需要。

https://www.devenezia.com/downloads/sas/samples/hash-6.sas处有一些基于散列的拆分器代码

您可以在sas社区找到其他数据拆分器。

答案 2 :(得分:0)

如果您想使用%scan(),则只需创建一个宏变量。

select distinct set
   into :z separated by ' '
   from &set
;
%let hm=&sqlobs;

DATA语句将在第一个分号处结束。但是您正在生成&hm+1分号,而不只是一个。从%do循环中删除虚假的分号。

data
%do i =1 %to &hm;
  %scan(&z, &i)
%end;
;