在阵列SAS中找到两个相等的最高值

时间:2016-06-03 03:46:15

标签: arrays sas

我想为每个yearrevtype找到最佳收入。如图所示,如果月apr的销售额最高,则apr将列在best_sale列下。如果有两个月具有相同的最高值,那么我希望它们都在best_sale列中。

enter image description here

data year;
  set similar;
  array k(*) jan--dec;

  do i=1 to dim(k);
    do j=i to dim(k);
      if k(i)=max(of k(*)) then best_sale=vname(k(i));
      if best_sale=vname(k(j)) then output year;
    end;
  end;
  drop i j;
run;


proc sort data=year nodup out=y;
  by year;
run;

data best;
  length cat $100.;
    do until (last.year);
      set y;
      by year;
      cat=catx(',',cat,best_sale);
    end;
  drop best_sale;
run;

当我运行上述代码时,它不会考虑revtype,因为do until循环仅针对year运行。但我希望每年最好的销售 revtypes,“货物”和“乘客”。

2 个答案:

答案 0 :(得分:0)

关于从数组中获取两个最大值,请尝试ordinal函数:

data year;
set similar;
array k(*) jan--dec;
do i = 1 to dim(k);
  do j = 0 to 1;
    if k[i] = ordinal(dim(k) - j, of k[*]) then do;
      best_sale = vname(k[i]);
      output year;
    end;
  end;
end;
run;

答案 1 :(得分:0)

我不确定我是否了解整个图片,但此代码可能会让您更进一步。如果这不是您想要的输出,请提供其他详细信息。 (不确定您是否希望在最后一步中将最佳销售数据显示在多行上,以及您的similar数据集中是否有多个条目具有相同的yearrevtype - 在这种情况下,提供更完整的样本数据集将证明是有用的。)

data have;
  informat year 8. revtype $24. jan feb mar apr may jun jul aug sep oct nov dec 8.;
  input year revtype jan--dec;
  datalines;
1997 cargo 100 50 125 200 . . . . . . . . .
1997 passenger 200 256 235 256 . . . . . . . .
1998 cargo 300 111 435 109 . . . . . . . .
;

data want;
  set have;
  format max_sales 8. best_months $24.;
  array month(12) jan--dec;

  max_sales = max(of month(*));

  do _i = 1 to 12;
    if month(_i) = max_sales then 
      best_months = catx(",", best_months, vname(month(_i)));
  end;

  drop max_sales _i;
run;

结果

Resulting dataset