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

如何在宏SAS中访问循环中数组的第n个元素?,sas,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 &am

我试图在宏定义中获取%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)
,但仍然没有运气

问题:

  • 您有一个宏变量集,但在select查询中有一个distinct集,这是您想要的吗

    select distinct set
    
  • 创建宏变量时,不需要指定序列的结尾

    select distinct &set into :z1- from &set; quit;
    
  • 您创建了一系列宏变量Z1 Zn,但是否尝试使用扫描来检索这些值?它们不是存储在数组中,而是存储在一系列宏变量中,如Z1、Z2等


  • output
    语句不能指定动态目标表。您需要创建墙纸代码,以便根据拆分条件输出到相应的表中

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

    data &out1 &out2 … &outN;
      set input_data;
      select;
        when (&case1) output &out1;
        when (&case2) output &out2;
        …
        when (&caseN) output &outN;
        otherwise;
      end;
    run;
    
    data &outlist;
      set input_data;
      select;
        &whenStatements;
        otherwise;
      end;
    run;
    
    一些巧妙的SQL可以支持该模板

    data &out1 &out2 … &outN;
      set input_data;
      select;
        when (&case1) output &out1;
        when (&case2) output &out2;
        …
        when (&caseN) output &outN;
        otherwise;
      end;
    run;
    
    data &outlist;
      set input_data;
      select;
        &whenStatements;
        otherwise;
      end;
    run;
    
    output()方法可以指定保存哈希内容的动态目标。考虑“将表分割成子集表,其名称基于变量值”“AKA”将一个数据集设置成根据组变量命名的多个数据集。有些方法需要对数据进行预解析(如在发布的代码中),而其他方法则不需要

    这里有一些基于散列的拆分器代码


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

    如果要使用
    %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;
    ;
    

    这是怎么回事,让你觉得不走运?它只创建了一个名为“z”的数据集,而不是我想使用“set”列中的值创建的三个数据集,Google'sas将数据拆分为子集',如果这是你正在尝试做的,你会发现大量的示例。感谢回复!1:是的,这是有意的,我称第一个参数为“set”,但这也是存储集合名称的列的名称,我的意思是。3:谢谢你的澄清,我只是从每件事开始,所以我还是可能会误解一些事情。如果它们是变量,那么使用symget()或其他方式访问它们就足够了吗?