SAS 执行循环和宏

SAS do loops and macros

我尝试开发代码并确保我将包括与新扩展平均值的比较,但是它没有按应有的方式工作。

能否请您告知需要做什么,以便条件(值 1 < saved_average 和值 2 < saved_average 和值 3 < saved_average)始终测试不 saved_average 但新创建的 required_result 变量?

Data want;
 Set have;
 If (value1 < value2 < value3) and (_n_ > 2) and (_n_ > max_recordnum) then do;
  max_recordnum = _n_ + 3;
  Saved_average = average1;
 End;
 Retain max_recordnum saved_average;
 If saved_average = . Then required_result = average1;
 Else required_result = saved_average;
 If (value1 < saved_average and value2 < saved_average and value3 < saved_average) and (_n_ > max_recordnums) and (_n_ > max_recordnum) then do;
  max_recordnums = _n_ + 3;
  Saved_average2 = average1;
 End;
 Retain max_recordnums saved_average2;
 If saved_average2 = .  And  saved_average = . Then required_result = average1;
 Else required_result = saved_average;
 If saved_average2 <> .  Then required_result = saved_average2;
Run;

不确定为什么,但在上面的代码中所有观察计数器(下划线 n 下划线)都变成了 n。可能是因为我在 iPad.

上输入了所有内容

我对 SAS 编程还很陌生,因此,如果您能就我遇到的问题的可能解决方案提供任何意见,我将不胜感激!

我有以下数据:

value1       value2     value3     average1    required_result
1              9         12           7               7
8              6         9            6               7
4              7         10           2               7
6              2         1            8               7
.              .         .            .        
.              .         .            .
.              .         .            .
7              9         16           24              24
.              .          .            .              24
X              Y          Z            W

我需要做以下事情:

例如第一行value1 > value2> value3 (1 > 9 > 12) 因此我们需要使用average1 = 7 从第一行开始接下来的4行。

能否请您告知如何在 SAS 中对其进行编码?

干得好,自己动手吧,欢迎访问该站点。 我的回答不是最优雅的,但它解决了你的问题。您不需要宏或 _N_,但 retain 会派上用场。

这是我的代码。您保留平均值,并有一个 运行 计数以确保您在接下来的四次观察中保留它。第四次观察后,您需要重新设置计数和超额,直到主要条件再次为真。

data ORIG_DATA;
    input value1   value2     value3     average1;
    cards;
1              9         12           7               
8              6         9            6               
4              7         10           2               
6              2         1            8               
.              .         .            .        
.              .         .            .
.              .         .            .
7              9         16           24              
.              .          .            .              
;
run;

data want (drop=obs_count);
    set Orig_data;
    retain carried_average;
    retain obs_count;

    if (obs_count le 0 or obs_count gt 4) and value1 lt value2 AND value2 lt value3 Then
        do;
            carried_average = average1;
            obs_count = 1;
        end;
    else if (obs_count ge 0 and obs_count le 4) then
        obs_count + 1;

    if obs_count gt 4 then
        do;
            carried_average = .;
        end;
RUN;