我试图在宏中找到最多四个变量Value_A Value_B Value_C Value_D
。我以为我可以做%sysfunc(max(value_&i.))
但这不起作用。我的完整代码是:
%let i = (A B C D);
%macro maxvalue;
data want;
set have;
%do j = 1 %to %sysfunc(countw(&list.));
%let i = %scan(&list.,&j.);
value_&i.= Sale_&i. - int_&i.
Max_Value = %sysfunc(max(value_&i.));
%end;
run;
%mend maxvalue;
%maxvalue;
我应该指定我只想要每个观察的四个变量的最大值。谢谢你的帮助!
答案 0 :(得分:3)
除了错字 - %let i=(A B C D);
应该是%let list=(A B C D)
- 你是a)过于复杂,b)混淆宏语法和datastep语法。虽然你可以使用宏来做到这一点,但是没有必要。
鉴于所讨论的变量都以类似的方式加上前缀(尽管如果它们是数字后缀的话会更好,例如Value1,Value2),使用数组和相应的函数要容易得多:
data want ; set have ; array sale{*} Sale_A Sale_B Sale_C Sale_D ; array int{*} Int_A Int_B Int_C Int_D ; array value{*} Value_A Value_B Value_C Value_D ; /* Iterate over array */ do i = 1 to dim(sale) ; value{i} = sum(sale{i},-int{i}) ; end ; max_value = max(of value{*}) ; run ;
答案 1 :(得分:1)
为什么不将变量重命名为SALE_1到SALE_4?然后,您可以使用简单的变量列表SALE_1-SALE_4
来引用它们。
如果要在类似命名变量的列表上使用非数字后缀,那么您真正需要的是一个简单的函数样式宏,用于根据基本名称和后缀值列表生成变量名称列表。 / p>
%macro generate_names(base,list);
&base%sysfunc(tranwrd(%sysfunc(compbl(&list)),%str( ),%str( &base)))
%mend generate_names;
然后生成用于ARRAY语句的变量列表更容易
%let suffixes=A B C D;
array sale %generate_names(Sale_,&suffixes);
array int %generate_names(Int_,&suffixes);
array value %generate_names(Value_,&suffixes);
和其他陈述。
max_value = max(of %generate_names(Value_,&suffixes)) ;
答案 2 :(得分:1)
如前所述,您过度复杂,但您可以通过在///<reference path"/>
作业中包含另一个for循环来实现您尝试使用宏逻辑执行的操作。此方法涉及您获取四个变量的最大值和一个缺失值,这将产生所需的结果:
max_value