在宏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;

这是个好主意!我正在做的整个程序有很多计算,我不想手动命名一组只保存计算结果的数组。但我不知道如何生成用于数组的变量列表。谢谢