在宏SAS中使用max函数

时间:2016-07-21 21:14:29

标签: sas sas-macro

我试图在宏中找到最多四个变量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;

我应该指定我只想要每个观察的四个变量的最大值。谢谢你的帮助!

3 个答案:

答案 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