计数器里面的宏

时间:2017-02-23 16:05:52

标签: loops count macros sas

这适用于SAS代码

我的代码是:

%macro replicate (new, out, n);
data &out;
set &new;
%do i=1 %to &n-1;
data &out;
set &out &new;
if d <.22 then count +1;
run;

/ *使用此行调用宏* / %replicate(new,out,8);

这是数据集中的前几个观察结果(称为新的) 字段名称是通过...(所以注意d(在循环中提到)是第四个值)

  1. 0.10,0.15,0.16,0.22,0.30,1
  2. 0.07,0.14,0.15,0.21,0.29,1 +
  3. 0.10,0.15,0.16,0.22,0.30,1
  4. 0.09,0.14,0.15,0.21,0.30,1
  5. 相应的计数值为0,7,1,8,.....

    关于此代码的目的,我正在教授统计课程,并试图最终表明,从长远来看,计数器总数应该根据概率定律(列D数字是随机生成的)数字来运行来自任意的例子。

    我不知道如何计算。有人可以帮忙吗?

    感谢

    约翰

1 个答案:

答案 0 :(得分:1)

为了理解发生了什么,我建议你摆脱宏逻辑,并逐步运行宏调用生成的代码,查看结果。

示例数据:

data new;
  input d;
  cards;
0.22
0.21
0.22
0.21
;

在循环之前你有:

68   data out;
69     set new;
70     put (d)(=);
71   run;

d=0.22
d=0.21
d=0.22
d=0.21

没什么特别的。在循环的第一次迭代中,您将引入计数器,并且它可以按预期工作:

3   data out;
74     set out new;
75     if d < .22 then count+1 ;
76     put (d count)(=);
77   run;

d=0.22 count=0
d=0.21 count=1
d=0.22 count=1
d=0.21 count=2
d=0.22 count=2
d=0.21 count=3
d=0.22 count=3
d=0.21 count=4

在循环的第二次迭代中注意,正在读入的数据中存在变量COUNT(SET语句中的work.OUT)。因此,对于前八个记录,count的现有值有条件地增加1。它不是一个新的柜台。如果您想要一个新计数器,可以将SET语句更改为set out(drop=count) new ;

所以&amp; i = 2循环的迭代看起来像:

79   data out;
80     set out new;
81     if d < .22 then count+1 ;
82     put (d count)(=);
83   run;

d=0.22 count=0
d=0.21 count=2
d=0.22 count=1
d=0.21 count=3
d=0.22 count=2
d=0.21 count=4
d=0.22 count=3
d=0.21 count=5
d=0.22 count=.
d=0.21 count=1
d=0.22 count=1
d=0.21 count=2

如果您继续重新提交该步骤,则在第7次迭代中,您将获得您在问题中声明的内容:

109  data out;
110    set out new;
111    if d < .22 then count+1 ;
112    put (d count)(=);
113  run;

d=0.22 count=0
d=0.21 count=7
d=0.22 count=1
d=0.21 count=8
d=0.22 count=2
d=0.21 count=9
d=0.22 count=3
d=0.21 count=10
d=0.22 count=.
d=0.21 count=6
d=0.22 count=1
d=0.21 count=7
d=0.22 count=.
d=0.21 count=5
d=0.22 count=1
d=0.21 count=6
d=0.22 count=.
d=0.21 count=4
d=0.22 count=1
d=0.21 count=5
d=0.22 count=.
d=0.21 count=3
d=0.22 count=1
d=0.21 count=4
d=0.22 count=.
d=0.21 count=2
d=0.22 count=1
d=0.21 count=3
d=0.22 count=.
d=0.21 count=1
d=0.22 count=1
d=0.21 count=2

我还不清楚你要做什么。这是一个奇怪的结构,不断覆盖work.out自己,自我追加。但是使用DATA步骤代码可以帮助显示正在发生的事情。