在宏SAS中使用max函数
我试图在宏中找到四个变量的最大值,在宏SAS中使用max函数,sas,sas-macro,Sas,Sas Macro,我试图在宏中找到四个变量的最大值,Value\u A Value\u B Value\u C Value\u 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(&
Value\u A Value\u B Value\u C Value\u 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;
我应该指定我只想要每个观测值的四个变量的最大值。谢谢你的帮助 除了打字之外-
%let i=(A B C D)代码>应该是%let list=(A B C D)
-您A)过于复杂,B)将宏语法与数据步骤语法混淆。虽然可以使用宏来执行此操作,但没有必要
考虑到所讨论的变量都以类似的方式加上前缀(尽管如果它们加上数字后缀会更好,例如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 ;
数据需求;
集有;
阵列销售{*}销售A销售B销售C销售D;
数组int{*}int_A int_B int_C int_D;
数组值{*}value\u A值\u B值\u C值\u D;
/*迭代数组*/
i=1时变暗(销售);
值{i}=sum(sale{i},-int{i});
结束;
max_value=max(值{*});
跑
为什么不将变量重命名为SALE_1到SALE_4?然后,您可以使用一个简单的变量列表SALE\u 1-SALE\u 4
来引用它们
如果要在具有类似名称的变量列表上使用非数字后缀,那么可能真正需要的是一个简单的函数样式宏,用于根据基名称和后缀值列表生成变量名称列表
%macro generate_names(base,list);
&base%sysfunc(tranwrd(%sysfunc(compbl(&list)),%str( ),%str( &base)))
%mend generate_names;
这样就更容易生成用于数组语句的变量列表
%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)) ;
如前所述,这一点过于复杂,但您可以通过在max\u值
赋值中包含另一个for循环来实现使用宏逻辑试图实现的目标。此方法包括取四个变量中的最大值和一个缺失值,这将产生所需的结果:
%let list = 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.
%end;
max_value = max(
%do x = 1 %to %sysfunc(countw(&list.));
%let y = %scan(&list.,&x.);
value_&y.,
%end; .
);
run;
%mend maxvalue;
%maxvalue;
这是个好主意!我正在做的整个程序有很多计算,我不想手动命名一组只保存计算结果的数组。但我不知道如何生成用于数组的变量列表。谢谢