【问题标题】:counter inside of a macro宏内的计数器
【发布时间】:2017-02-23 16:05:51
【问题描述】:

这是 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);

这是数据集中的前几个观察值(称为新的) 字段名称是一个 thru f .....(所以请注意 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

count对应的值为0,7,1,8,.....

关于这段代码的目的,我正在教授一门统计课程,并试图最终展示从长远来看,计数器总数应该如何根据概率定律工作(D 列数字是随机生成的)数字来自一个任意的例子。

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

谢谢

约翰

【问题讨论】:

  • 这是 SAS,对吗?如果您使用适当的标签,例如sas(如果这对于这个问题是正确的),您会发现您会得到更多的答案。事实上,任何 SAS 专家都没有理由看你的问题。
  • 谢谢 Rici,我已经做到了。
  • 建议你显示完整的宏,以及你如何调用宏。还要描述预期目的,因为从代码中不清楚为什么要在循环中运行该步骤。

标签: loops count macros sas


【解决方案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)。因此,对于前 8 条记录,count 的现有值有条件地加 1。这不是一个新的计数器。如果你想要一个新的计数器,你可以将 SET 语句更改为set out(drop=count) new ;

所以 &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 步代码应该有助于显示正在发生的事情。

【讨论】:

    猜你喜欢
    • 2018-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多