2012-04-04 55 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

相關問題