如何使用SAS do循环将数据输入宏?

时间:2018-04-13 21:42:46

标签: sas

我有以下我创建的宏和数据集

%censusdata (districtname=,districtnum=);

data districtcodes;
input distnumber distname$;
cards;
1   Kaap/Cape   
2   Simonstad   
3   Bellville   
4   Goodwood    
5   Kuilsrivier 
6   Wynberg 
run;

基本上我想创建一个do循环,它从distname数据集中获取districtcodes并将其输入distrctname宏中的%censusdata,{{1}并将其输入宏中的distnumber字段。

我应该怎么做?

2 个答案:

答案 0 :(得分:3)

假设您已经开发了一个宏,可以使用CALL EXECUTE和数据集中的参数值来调用它。

”end-1c”

答案 1 :(得分:1)

如您所见,DATA步骤datalines(又名cards)与宏系统不兼容。

您可能想重新考虑数据必须在宏内的原因。有一些用例,但最初看起来比较少。

无论推理如何,都有两种方式(还有更多)

  • 将数据放在DATA步骤字符串中,并使用scan
  • 解析出来
  • 将数据放在宏变量中并使用%scan
  • 解析出来
  • 在调用宏之前创建数据集并传递数据集名称

这是一个使用DATA步骤字符串解析

%macro censusdata (districtname=,districtnum=);

data districtcodes (keep=dist:);
*input distnumber distname$;
*cards;
data = "
 1   Kaap/Cape   
 2   Simonstad   
 3   Bellville   
 4   Goodwood    
 5   Kuilsrivier 
 6   Wynberg 
";


put data=;
put data= $HEX60.;

  do _n_ = 1 by 1 while (length(scan(data,_n_,' ')));
    distnumber = input ( scan (data, _n_, ' '), best8. );
    _n_ + 1;
    districtname = scan (data, _n_, ' ');
    output;

    if _n_ > 10 then stop;
  end;
  stop;
run;

%mend;

%censusdata();

你展示的宏示例似乎有点奇怪,因为你传递参数,表面上是为了帮助操作一些数据,这是一个关于宏的静态实体。

更合理的方法可能是

  • 完全消除宏
  • 传递数据集的名称,以及用于某些代码生成的变量名称。

只有在满足操作模型的各种数据集上执行相同类型的处理时,这样的宏才有意义(即数据集至少有两列,一列用于代码,第二列用于某些相关文字)。

正如您所看到的,使用高度特定的名称和参数(例如censusdatadistrictnamedistrictcode)对宏进行编码可能是一个几乎没有重用价值的包装器。

data districtcodes;
input distnumber distname$;
cards;
1   Kaap/Cape   
2   Simonstad   
3   Bellville   
4   Goodwood    
5   Kuilsrivier 
6   Wynberg 
run;

示例调用

%censusdata (data=districtcodes, codevar=distnumber, namevar=distname);
%mend;