我遇到错误"找到的位置参数多于定义的"对于以下代码:
%let my_list_of_vars = x, y, z;
%macro sumstats(my_vars);
proc sql;
create table test2 as
select distinct &my_vars.
from my_dataset;
quit;
%mend sumstats;
%sumstats(&my_list_of_vars.);
我不太确定proc sql为什么不接受我的变量列表" x"," y"和" z& #34;,而是返回该错误。我已经在线查看,似乎无法找到解决此问题的方法。例如,这个网站(http://support.sas.com/kb/31/012.html)建议使用%put或%bquote,但都不起作用。非常感谢一些指导。
谢谢。
答案 0 :(得分:1)
您的代码解析为以下内容,因此您需要屏蔽宏调用中的逗号。
list_of_df_to_dump = [df1,df2,...,df100]
list_of_tab_names = ['df1','df2',...,'df100']
writer = ExcelWriter(excel_name + '.xlsx')
for df, tab_name in zip(list_of_df_to_dump, list_of_tab_names):
df.to_excel(writer, tab_name, index=False)
writer.save()
不正确:尝试使用%sumstats(x, y, z);
%str()
编辑: 你有例2,所以%BQUOTE()是正确的。
%sumstats(%str(&my_list_of_vars.));
SAS关于此问题和解决方案的说明: http://support.sas.com/kb/31/012.html
答案 1 :(得分:1)
不要尝试使用逗号作为变量名列表中的分隔符。这在普通的SAS代码中不是很有用,并且在函数调用或宏调用中尝试使用它们时会导致头痛和混乱。而是在需要时添加逗号。
%macro sumstats(my_vars);
* Normal SAS code ;
proc sort data=my_dataset(keep=&my_vars) out=test1 nodupkey;
run;
* Make version of list with commas for use in PROC SQL code ;
%local my_varsc ;
%let my_varsc = %sysfunc(compbl(&my_vars));
%let my_varsc = %sysfunc(translate(&my_varsc,',',' '));
proc sql;
create table test2 as
select distinct &my_varsc
from my_dataset
;
quit;
%mend sumstats;
%let my_list_of_vars = x y z;
%sumstats(&my_list_of_vars.);