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
我需要做以下事情:
- 如果第 n 行有以下趋势 - value1 > value2> value3,则对接下来的 4 行使用第一个遇到的 average1 值;
- 在 4 行之后计算 value1 > value2 > value3 是否为真。如果为真,则对另外 4 行使用下一个第一次遇到的 average1 值;
- 重复。
例如第一行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;
我尝试开发代码并确保我将包括与新扩展平均值的比较,但是它没有按应有的方式工作。
能否请您告知需要做什么,以便条件(值 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
我需要做以下事情:
- 如果第 n 行有以下趋势 - value1 > value2> value3,则对接下来的 4 行使用第一个遇到的 average1 值;
- 在 4 行之后计算 value1 > value2 > value3 是否为真。如果为真,则对另外 4 行使用下一个第一次遇到的 average1 值;
- 重复。
例如第一行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;