【问题标题】:Add the index of the column with the maximum value as a new column将具有最大值的列的索引添加为新列
【发布时间】:2012-04-04 04:29:54
【问题描述】:

我的问题很简单。当数据如下时,

var1    var2    var3
10      40      60
15      10      5

我想添加一个新列MaxValueVar,它返回在var1var2var3 中具有最大值的列的索引。也就是我想做一个如下表。

var1    var2    var3    MaxValueVar
10      40      60      3
15      10      5       1

在 R 中我会使用:

apply(vector, 1, which.max)

我如何使用 SAS 来完成这项工作?

【问题讨论】:

  • 您的问题是在询问如何在 SAS 中实现这一点吗?
  • @Dason 对。抱歉,我的问题令人困惑。
  • 您想如何处理丢失的数据?你想如何处理最大的平局(即 - 如果你在第一行有两个 60 的实例)?这些会稍微影响潜在的答案。
  • @thelatemail 你是对的。但到目前为止,我不需要关心缺失值或绑定值。因此,如果存在缺失或平局值困扰您,请忽略它。谢谢。

标签: r sas max apply


【解决方案1】:

根据您在此处提供的示例提供一个解决方案供您参考。你没有提到如何处理关系。这里对于平局,获取第一个匹配项。

data test;
input var1 var2 var3;
datalines;
10      40      60
15      10      5
run;

data test;
 set test;
 maxvalue=max(of var1-var3);
 maxvaluevar=0;
  array vars (*) var1-var3;
    do i=1 to dim(vars);
     if maxvaluevar=0 then maxvaluevar=i*(maxvalue=vars(i))+maxvaluevar;
    end;
 drop i maxvalue;
run;

【讨论】:

  • @Robbie_Liu 谢谢你,Robbie_Liu。但我无法理解“i*(maxvalue=vars(i))”。你能解释更多吗?
  • @Robbie_Liu (maxvalue=vars(i))
  • 可以改写为if maxvaluevar = 0 and maxvalue = vars(i) then maxvaluevar = i;
  • @TaeHeonKim Maxvalue=vars(i) 在列是否等于最大值时返回 0 或 1。然后通过乘以 i,我们得到列号。克里斯是对的。您可能会发现它更容易理解。
  • 非常感谢你们。
【解决方案2】:

这里有一个与 Robbie's 类似的解决方案。它使用vname()函数获取数组中除索引之外的第一个最大值的变量名。

data maxarr (drop=i);
input var1 var2 var3;
 array vars(*) var1-var3;
 max=max(of vars(*));
   do i=1 to dim(vars);
     if vars(i)=max then do;
          MaxValueIndx=i;
          MaxValueVar=vname(vars(i));
          leave;
     end;
   end;
datalines;
10      40      60
15      10      5
;
run;

proc print data=maxarr noobs;run;

【讨论】:

  • 谢谢你,cmjohns。但我有一个问题。什么是“离开”?我检查了您的代码是否可以在没有“离开”的情况下正常工作。
  • 它只是阻止循环继续过去我们需要的地方,选择它看到的第一个匹配项。如果我不使用leave,它将处理整个数组并返回最后一个匹配项。
【解决方案3】:

下面的代码应该可以按预期工作,并在存在关联的情况下创建更多列。我知道你说过不要打扰,但这让我很烦!

输入测试数据:

data test;
    input var1 var2 var3;
    cards;
10 40 60
15 10 5
7 8 9
13 13 10
5 7 6
10 11 12
10 10 10
1 3 2
3 3 1
;
run;

检查最大值的代码:

data test (drop = i howmanymax);
    set test;
    retain howmanymax;

    howmanymax=0;

    array varlist[*] var1--var3;
    array maxnum[3];

    do i = 1 to DIM(varlist);
        if varlist[i] = max(of var1--var3)
            then do;
                howmanymax+1;
                maxnum[howmanymax] = i;
            end;
    end;

run;

输出如下:

  var1  var2  var3  nummax1 nummax2 nummax3
    10    40    60        3       .       .
    15    10     5        1       .       .
     7     8     9        3       .       .
    13    13    10        1       2       .
     5     7     6        2       .       .
    10    11    12        3       .       .
    10    10    10        1       2       3
     1     3     2        2       .       .
     3     3     1        1       2       .

【讨论】:

  • 感谢您在检查具有相同最大值的列数方面提供的额外帮助。
  • @TaeHeonKim - 没问题,很乐意提供帮助 - 不要忘记投票并选择一个接受的答案(不一定是我的!)
猜你喜欢
  • 2014-12-01
  • 1970-01-01
  • 2015-07-12
  • 2016-11-03
  • 1970-01-01
  • 2017-11-25
  • 1970-01-01
  • 2022-01-13
相关资源
最近更新 更多