【问题标题】:SAS duplicate maximum values across rowsSAS跨行重复最大值
【发布时间】:2015-09-03 14:44:13
【问题描述】:

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

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 且众数 = max,则我输出相同的观测值。但是,如果有多个相同的最大值,我对如何让 SAS 输出不同的策略感到困惑。

【问题讨论】:

  • 我不熟悉 SAS,但我会循环遍历公司的每个策略以找到最高分(例如,50),然后遍历每个策略并添加如果该策略的得分等于之前计算的最大得分,则将其放入策略的存储桶中。正如我所说,我不是很了解你的代码,但看起来你已经实现了前半部分。

标签: sas


【解决方案1】:

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

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;

【讨论】:

  • 我认为您需要多一行来输出相关策略? Max_Strategy=vname(strategies(_i)); 另外,循环应该以 strategy 还是 _i 开头?
  • _i 很旧,抱歉。 Strategy(循环计数器)实际上是相关策略。如果需要,我会使用一种格式来添加文本。
  • 此答案适用于 Reeza 建议的附加行。谢谢你。我把它弄得太复杂了。
【解决方案2】:

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

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

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

Data want;
  set have;
   MAX = max(of strategy1-strategy22);
   array nums {22} strategy1-strategy22;
     do i = _n_+1 to 22;
        if nums{i} eq MAX then do;
            strategy = "strategy" + i
            output;
     end;
 Run;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-03
    • 2022-01-16
    • 1970-01-01
    • 2014-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多