【问题标题】:How to access nth element of array within loop in macro SAS?如何在宏SAS的循环中访问数组的第n个元素?
【发布时间】:2018-06-26 18:35:36
【问题描述】:

我正在尝试在宏定义中的 %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) 但仍然没有运气

【问题讨论】:

  • 发生了什么让你感到不走运?
  • 它只创建一个名为“z”的数据集,而不是我想使用“set”列中的值创建的三个数据集
  • 谷歌“sas 将数据拆分为子集”,如果您正在尝试这样做,您会找到大量示例。

标签: sas


【解决方案1】:

问题:

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

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

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

【讨论】:

  • 感谢您的回复! 1:是的,这是有意的,我将第一个参数称为“set”,但这也是存储集合名称的列的名称,我的错误。 3:谢谢澄清,我只是从一切开始,所以我仍然可能会误解一些东西。如果它们是变量,那么使用 symget() 或其他方式访问它们就足够了吗?
【解决方案2】:

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 社区找到其他数据拆分器。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-27
      • 1970-01-01
      • 2020-09-06
      相关资源
      最近更新 更多