2012-04-04 56 views
3

我的问题很简单。当数据如下,将具有最大值的列的索引作为新列添加

var1 var2 var3 
10  40  60 
15  10  5 

我想添加一个新列MaxValueVar返回有中var1var2var3最大值列的索引。那就是,我想制作一张如下表格。

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

在R I使用:

apply(vector, 1, which.max) 

我怎样才能做到这一点使用SAS?

+0

是您的问题询问有关如何在SAS做到这一点? – Dason 2012-04-04 04:52:14

+0

@Dason Right。对不起,我的问题很混乱。 – 2012-04-04 04:57:51

+0

你想对丢失的数据做什么?你想如何处理最大的关系(即 - 如果你在第一行有两个60的实例)?这些会影响潜在的答案。 – thelatemail 2012-04-04 06:40:05

回答

4

根据您在此提供的示例提供一个供您参考的解决方案。你没有提到如何处理关系。在这里为了关系,第一次出现被提取。

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; 
+0

@Robbie_Liu谢谢你,Robbie_Liu。但我无法理解“我*(maxvalue = vars(i))”。你能解释更多吗? – 2012-04-04 07:36:50

+0

@Robbie_Liu(maxvalue = vars(i))< - 这部分是否意味着'如果'的短语? – 2012-04-04 07:45:03

+0

它可以被重写为'if maxvaluevar = 0且maxvalue = vars(i)then maxvaluevar = i;' – 2012-04-04 09:37:20

2

这是一个类似罗比的解决方案。它使用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; 
+0

谢谢,cmjohns。但我有一个问题。什么是“离开”?我检查了你的代码工作正常,没有“离开”。 – 2012-04-06 01:03:36

+0

它只是停止循环,继续过去我们需要的地方,选择它看到的第一场比赛。如果我没有使用'leave',它会处理整个数组,最后的匹配将被返回。 – cmjohns 2012-04-10 21:02:50

2

下面的代码应该像预期的那样工作,以及在有关系的实例中创建更多的列。我知道你说不要打扰,但是这让我烦恼!

输入的测试数据:

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  . 
+0

感谢您提供有关检查具有相同最大值的列数的其他帮助。 – 2012-04-06 01:14:03

+0

@TaeHeonKim - 没有问题,乐于帮助 - 不要忘记投票并选择一个被接受的答案(不一定是我的!) – thelatemail 2012-04-06 01:53:37

相关问题