【问题标题】:SAS Macro Do Loop IssuesSAS 宏执行循环问题
【发布时间】:2019-08-08 16:44:35
【问题描述】:

我有一个非常简单的要求。循环遍历数据集,将每个观察值转换为宏变量,然后对该宏变量进行比较。这是我的代码的样子:

%do n = 1 %to &i2.;

data want;
set have;
%if _N_ = &n. %then %do;
call symputx("Var1",var1);
call symputx("var2",var2);
%end;
run;

data want;
retain FinalCount
set have;
where Variable1="&var1.";
by SomeVariable
if first.SomeVariable then FinalCount=0;
if final="FINAL" then FinalCount+1;
if Finalcount=&var2. then Final_Samples=1;
finalCount=FinalCount;
run;

%end

_N_ = &n. 部分中失败的部分。我不断收到错误消息“变量 N 已被定义为字符和数字。”基本上我只需要将每个观察值设置为一个宏变量一次即可进行下一次比较,然后继续进行下一个比较。所以,如果有更好的方法,请告诉我。否则,您能帮我弄清楚为什么这种比较不起作用吗?

【问题讨论】:

  • 宏变量N的值是1、23等数字串,永远不会等于字母串_N_。也许您想要一个实际的 IF 语句而不是那里的宏语句?
  • 我觉得应该是if _N_ = &n then do;吧?

标签: loops sas sas-macro


【解决方案1】:

如果您能解释您的更大问题,那么您可能会得到一个更好的答案,不需要您将数据值转换为宏变量。将值转换为字符串然后尝试再次比较它们会引入许多错误来源。

关于如何根据数据集中的第 N 个观察值设置宏变量的问题,请尝试其中一种。

如果它支持 FIRSTOBS= 和 OBS= 数据集选项。

data _null_;
  set have (firstobs=&n obs=&n);
  call symputx("Var1",var1);
  call symputx("var2",var2);
run;

如果数据集支持直接访问,则使用它。

data _null_;
  p = &n;
  set have point=p;
  call symputx("Var1",var1);
  call symputx("var2",var2);
  stop;
run;

如果不是,则使用 IF(不是宏 %if)。

data _null_;
  set have ;
  if _n_ = &n then do;
    call symputx("Var1",var1);
    call symputx("var2",var2);
    stop;
  end;
run;

【讨论】:

  • 所有 3 个修复工作,谢谢!。知道为什么宏 %if 会放弃比较吗?
  • 您需要了解宏处理器的作用。您的%IF_ 作为_N_ 的第一个字符与宏变量n 的值中的第一个数字进行比较。因为后者是数字而不是下划线,所以条件永远不会为真。对于宏处理器_N_ 只是一个三字符串。
  • 感谢汤姆的回复。这对我来说没有多大意义,有没有网站或来源可以指点我?我不明白为什么使用 %if 会使其从字面上理解而不是解析变量。
  • 哦,%if 在数据步之前得到处理,因为它现在是宏处理器的一部分,所以 _N_ 还不存在。感谢您的澄清,现在说得通了!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多