无法正确执行基本的sas程序

时间:2018-01-20 16:42:35

标签: sas

我是sas语言的新学习者。我知道这对你来说很容易。我只是想了解它如何使用宏变量。实际上,我只需要正确运行一个sas程序。我有两个marco变量 &安培; X = 12,20,40,77 &安培; Y = 12,45,54,78

我只需要计算它们的最大值和最小值。所以我写下这段代码:

%let &x=12 20 40 77;
%let &y=12 45 54 78;
%put max min (&&x);
%put max min (&&y); 

它向我显示了这个错误:

  

检测到开放代码语句递归

我试图找到解决方案,但它不起作用!请如何解决?

2 个答案:

答案 0 :(得分:0)

请参阅此link

我试着这样做。

string t;
if (x == 1) {
    t = "case 1";
} else if (x == 2) {
    t = "case 2";
} else if (x == 3) {
    t = "case 3";
} else {
    t = "other case";
}

我希望它有所帮助。

答案 1 :(得分:0)

要收到您收到的错误,您可能会混淆SAS。您发布的代码会产生以下错误:

WARNING: Apparent symbolic reference X not resolved.
ERROR: Expecting a variable name after %LET.
1    %let &x=12 20 40 77;
2    %let &y=12 45 54 78;
WARNING: Apparent symbolic reference Y not resolved.
ERROR: Expecting a variable name after %LET.
3    %put max min (&&x);
WARNING: Apparent symbolic reference X not resolved.
max min (&x)
4    %put max min (&&y);
WARNING: Apparent symbolic reference Y not resolved.
max min (&y)

在第一个语句中,您尝试使用宏变量X的值作为宏变量的名称来创建宏变量。但是从未定义过X,因此&X刚刚解析为&X。由于&不是在宏变量名称中使用的有效字符,因此最终会生成无效的%let语句。

如果我们修复前两个语句以便它们生成有效的%LET语句,那么代码就会运行。目前尚不清楚您希望它做什么,但它可以像SAS那样运作。

5    %let x=12 20 40 77;
6    %let y=12 45 54 78;
7    %put max min (&&x);
max min (12 20 40 77)
8    %put max min (&&y);
max min (12 45 54 78)

&语句中的额外%put只是让SAS必须通过两遍才能解析宏变量引用。第一遍将解析&&&并触发宏处理器再次传递。然后第二遍将正确解析结果&x到字符串12 20 40 77

最好使用SAS代码而不是宏代码处理数字。如果要使用MAX()函数找到数字列表的最大值。通常,当您使用空格分隔值但只能使用变量名而不是文字值时,可以在数据步骤中使用OF关键字。所以将空格更改为逗号。

 9   %put &=x ;
X=12 20 40 77
10   data _null_;
11     max=max(%sysfunc(translate(&x,%str(,),%str( ))));
12     put max=;
13   run;

max=77

如果您真的只想使用宏语言,请再次使用%SYSFUNC()函数调用MAX()函数。

14   %put max=%sysfunc(max(%sysfunc(translate(&x,%str(,),%str( )))));
max=77