两个连续值的平均值

Average values in two consecutive values

我在宏中有以下代码: ...

data HE2update (drop=sum_values n_values);
    set dst_end_update;
    by short_date HE;

    %if HE=2 or 3 %then %do;
        sum_values+value;
        n_values+1;

        %if HE=2 %then delete;
            %else %if HE=3 %then %do;
            value = round(sum_values/n_values);
            HE=2;
            %end;
    %end;
    %if HE>3 %then HE=HE-1;
        %else HE;
run;

我收到以下错误:错误 22-322:语法错误,应为以下之一:!、!!、&、*、**、+、-、/、<、<=、< >, =, >, ><, >=, AND, EQ, GE, GT, IN, LE、LT、MAX、MIN、NE、NG、NL、NOTIN、OR、^=、|、||、~=。

错误似乎与最后的 if/then/else 语句有关 我看不出需要更正的内容。任何帮助将不胜感激。

我认为这里根本不需要宏观逻辑。

data HE2update (drop=sum_values n_values);
    set dst_end_update;
    by short_date HE;

    if HE in (2, 3) then do;
        sum_values+value;
        n_values+1;

        if HE=2 then delete;
            else if HE=3 then do;
            value = round(sum_values/n_values);
            HE=2;
            end;
    end;
    if HE>3 then HE=HE-1;

run;

宏处理器用于生成代码,不对数据进行操作。

您的第一个 %IF 正在测试字符串 HE 是否等于 2(这是假的)然后将结果与数字 3(这是真的) 因此测试为真,这意味着生成这两个语句以包含在您的数据步骤中。

    sum_values+value;
    n_values+1;

%IF/%THEN/%DO/%END 块中的其他两个 %IF 测试均为假,因为字符串 HE 既不等于数字 2 也不等于数字3.

然后最后测试字符串 HE 是否大于数字 3 这是 TRUE 因为 H 在 ASCII 整理序列中位于 3 之后。这意味着您的程序将生成代码

HE=HE-1

请注意,该赋值语句没有结束分号。程序中的分号标志着 %IF/%THEN 语句的结束。

所以你生成的代码是:

 data HE2update (drop=sum_values n_values);
 set dst_end_update;
 by short_date HE;
 sum_values+value;
 n_values+1;
 HE=HE-1 run;

最后一个赋值语句不是有效的 SAS 语法。另外没有RUN;结束数据步骤。