S********a 发帖数: 359 | 1 一个dataset, 有一个变量x,是数量型的,比如取值11,20,35.。。。
我想求一个平均值赋给y,这个平均值是从a1到a&x的
%macro avg/parmbuff;
data temp1;
set temp;
%let x=%eval(x);
%if number<=7 %then %do;
y=mean(a1-a&x);
w=.;
%end;
run;
%mend;
ERROR: A character operand was found in the %EVAL function or %IF condition where a numeric operand is required. The condition was: daysleft
大包子答谢!! |
k*******a 发帖数: 772 | |
S********a 发帖数: 359 | 3 能说具体点吗?谢谢
【在 k*******a 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 这个不要用macro,用array
|
k*******a 发帖数: 772 | |
m********9 发帖数: 1985 | 5 不是那么简单因为X 是个变量。
%macro avg/parmbuff;
proc sql noprint;
select x into : x separated by " "
from temp
where number<=7;
quit;
data temp1;
set temp;
where number<=7;
%do _a = 1 %to %eval(%sysfunc(count(&x, %bquote( ))) + 1);
%let i= %scan(&x, &_a, %str( )));
y=mean(a1-a&i);
output;
%end;
run;
%mend;
|
S********a 发帖数: 359 | 6 三黄包先发了再看
【在 m********9 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 不是那么简单因为X 是个变量。 : %macro avg/parmbuff; : proc sql noprint; : select x into : x separated by " " : from temp : where number<=7; : quit; : data temp1; : set temp; : where number<=7;
|
k*******a 发帖数: 772 | 7 mean(a1-a&x)应该为 mean(of a1-a&x) |
A****t 发帖数: 141 | 8 把data step variable的值赋给macro variable,要用symput不能用%let,因为在data
step编译之前,macro语句就已经被执行了,所以你的%eval(x)里面,x就只是一个
character x
把%let那一行改成call symput('x',trim(left(x))); 应该就可以了 |
g****8 发帖数: 2828 | 9 %let是不行的。
光用call symput还不行,因为你得到的是最后一行的那个值,每一步都是。
要每次值不一样,得每一步跟着换变量名。
call symput('x'||put(_N_,best.),trim(left(x)));
这样,就涉及到调用的时候也需要跟着换的问题。
想了想,没有什么好方法,可能搞个自增的macro var &i在date step里面然后再用&&
x&i调用。
个人觉得SAS这个只取最后一行值,挺脑残的,下个版本应该改进一下。
data
【在 A****t 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 把data step variable的值赋给macro variable,要用symput不能用%let,因为在data : step编译之前,macro语句就已经被执行了,所以你的%eval(x)里面,x就只是一个 : character x : 把%let那一行改成call symput('x',trim(left(x))); 应该就可以了
|
g****8 发帖数: 2828 | |
|
|
m*********n 发帖数: 413 | 11 %if number<=7 %then %do;
。。。。
%end;
这个导致错误
ERROR: A character operand was found in the %EVAL function or %IF condition
where a numeric operand is required. The condition was: daysleft
先好好看看macro programming吧 |
m*********n 发帖数: 413 | 12 data step 是逐行扫描,不是永远取最后一行
&&
【在 g****8 的大作中提到】![](/moin_static193/solenoid/img/up.png) : %let是不行的。 : 光用call symput还不行,因为你得到的是最后一行的那个值,每一步都是。 : 要每次值不一样,得每一步跟着换变量名。 : call symput('x'||put(_N_,best.),trim(left(x))); : 这样,就涉及到调用的时候也需要跟着换的问题。 : 想了想,没有什么好方法,可能搞个自增的macro var &i在date step里面然后再用&& : x&i调用。 : 个人觉得SAS这个只取最后一行值,挺脑残的,下个版本应该改进一下。 : : data
|
S******3 发帖数: 66 | 13 这个真是七窍通了六窍。。。
楼上说了,自己好好学学MACRO吧。
【在 S********a 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 一个dataset, 有一个变量x,是数量型的,比如取值11,20,35.。。。 : 我想求一个平均值赋给y,这个平均值是从a1到a&x的 : %macro avg/parmbuff; : data temp1; : set temp; : %let x=%eval(x); : %if number<=7 %then %do; : y=mean(a1-a&x); : w=.; : %end;
|
g****8 发帖数: 2828 | 14 我说的是call symput这一步。
你不加给变量加个_N_, 那data step每次都是用取到的最后一行的那个值。
你可以去试试,我说的对不对。
我又没有说整个data step。
不要想当然哟。
【在 m*********n 的大作中提到】![](/moin_static193/solenoid/img/up.png) : data step 是逐行扫描,不是永远取最后一行 : : &&
|
g****8 发帖数: 2828 | 15 不需要用macro就能解决你的问题,
如果我用的sample data 对的话。
data temp;
array a(*) a1-a7;
input x a1 a2 a3 a4 a5 a6 a7 number;
ss=0;
do i =1 to x;
ss=ss+a(i);
end;
if number <7 then
avg=ss/x;
else avg=0;
cards;
7 2 3 4 5 6 3 2 2
3 5 4 5 2 1 4 5 3
5 3 3 2 1 3 5 3 8
;
run; |
S********a 发帖数: 359 | 16 谢谢楼上的回复,包子已经发了
想好好学学MACRO,能给推荐个书或是resource吗? |
m*******r 发帖数: 7495 | 17 你也是学统计的啊
【在 S********a 的大作中提到】![](/moin_static193/solenoid/img/up.png) : 一个dataset, 有一个变量x,是数量型的,比如取值11,20,35.。。。 : 我想求一个平均值赋给y,这个平均值是从a1到a&x的 : %macro avg/parmbuff; : data temp1; : set temp; : %let x=%eval(x); : %if number<=7 %then %do; : y=mean(a1-a&x); : w=.; : %end;
|