SAS跨行

时间:2015-09-03 14:44:13

标签: sas

我有一个如下所示的数据集:

company Assets Liabilities strategy1 strategy2 strategy3.....strategy22 
   1       500      500        0          50        50            50            
   2       200      300        33         30        33             0

我的目标是为所有策略(策略1 - 策略22)找到整行的最大值,并且基本上按照他们使用的策略对公司进行挖掘。当一些公司在多种策略下具有相同的最大价值时,就会出现问题。在这种情况下,我希望将公司置于多个桶中。最终的数据集将是这样的:

company Assets Liab. strategy1 strategy2 strategy3.....strategy22 Strategy
   1       500   500     0          50        50            50     Strategy2    
   1       500   500     0          50        50            50     Strategy3
   1       500   500     0          50        50            50     Strategy22

等。 最终目标是能够通过策略对公司的资产,负债等运行交易手段。到目前为止,我已经能够实现接近我想要的数据集,但在“策略”列中,我无法得到它,因此SAS并不总是输出具有最大值的第一个策略。

Data want;
  set have;
   MAX = max(of strategy1-strategy22);
   array nums {22} strategy1-strategy22;
     do _n_=1 to 21;
       count=1;
     do _i_ = _n_+1 to 22;
        if nums{_n_} = nums{_i_} AND nums{_i_} ne 0 then count + 1;
     end;
     if count > maxcount then do;
        mode = nums{_n_};
        maxcount = count;
     end;
  end;
 Run;
 Data want2;
  set want (where=( maxcount > 1 AND Mode = Max));
  by company;
   strat=1;
    do until (strat gt maxcount);
      output;
      strat = strat +1;
    end;
 Run;

基本上,我计算了相同最大值的模式和计数,如果maxcount> 1和mode = max然后我输出相同的观察结果。但是,如果存在多个相同的最大值,我会陷入困境,如何让SAS输出不同的策略。

2 个答案:

答案 0 :(得分:3)

这似乎比你需要的更复杂。

data want;
  set have;
  array strategies[22] strategy1-strategy22;
  do strategy = 1 to dim(strategies);
    if strategies[strategy] = max(of strategies[*]) then output;
  end;
run;

答案 1 :(得分:0)

如果策略列与MAX匹配,为什么不输出该行?

我的数组语言已关闭,但这里有一些伪代码可以做我想的...

如果您所在的列的值为EQ MAX,则输出该行并将策略列设置为您正在查看的策略:

div.Header-jpeg {
    position: absolute;
    z-index: -1;
    top: 0;
    left: 0;
    width: 874px;
    height: 94px;
    background-image: url('images/Header.jpg');
    background-repeat: no-repeat;
    background-position: center center;
}