我需要编写一个宏程序来生成移动平均计算列表,我需要构建一些这样的行:
var1_ma_past_1 = mean(var1,lag1(var1),lag2(var1),lag3(var1)……
的 无需在宏代码中使用CAT ...()函数。 强>
在用于连接值的宏代码中,您只需将它们彼此相邻展开即可。 看起来你的逻辑似乎正在混合I和J计数器。
%macro test ; %do i = 1 %to 5; %let list = ; %let dlm = ; %do j = 1 %to 5; %let list = &list.&dlm.lag&j(var&i) ; %let dlm = ,; %end; %put &=i &=list; %end; %mend test; %test
结果:
I=1 LIST=lag1(var1),lag2(var1),lag3(var1),lag4(var1),lag5(var1) I=2 LIST=lag1(var2),lag2(var2),lag3(var2),lag4(var2),lag5(var2) I=3 LIST=lag1(var3),lag2(var3),lag3(var3),lag4(var3),lag5(var3) I=4 LIST=lag1(var4),lag2(var4),lag3(var4),lag4(var4),lag5(var4) I=5 LIST=lag1(var5),lag2(var5),lag3(var5),lag4(var5),lag5(var5)
对于您的实际问题,您可能希望创建一个宏,该宏仅返回逗号分隔列表作为宏调用的结果。
%macro lags(varname,first,last); %local lag dlm; %do lag= &first %to &last ; %if (&lag > 0) %then %*;&dlm.lag&lag(&varname); %else %*;&dlm.&varname; %let dlm=,; %end; %mend lags; %put var1_ma_past_1=mean(%lags(var1,0,5)); %put var1_ma_past_2=mean(%lags(var1,1,6)); %put var1_ma_past_3=mean(%lags(var1,2,7)); %put var2_ma_past_1=mean(%lags(var2,0,5));
的 为什么要收到这些错误消息: 强>
该 %sysfunc() 宏函数需要试图弄清楚每个参数是否为函数的字符或数字 CATX() 可以对任何类型的输入进行操作。这就是为什么 () 在参数值中混淆它,因为它看起来像你试图传递数值表达式。
%sysfunc()
CATX()
()
18 %put %sysfunc(catx(|,a(b),b)); ERROR: Required operator not found in expression: a(b) a(b)|B 19 %put %sysfunc(catx(|,(1+2),b)); 3|B
您可以在值周围强制引用,然后在以后删除它们(如果您的值实际上不包含引号)。
%let left=A(b); %let right=b; %let intermediate=%sysfunc(catx(|,"&left","&right")); %let want=%sysfunc(compress(&intermediate,%str(%")); %put &=want;