2012-04-04 2 views
3

Мой вопрос прост. Когда данные, как показано ниже,Добавьте индекс столбца с максимальным значением в качестве нового столбца

var1 var2 var3 
10  40  60 
15  10  5 

Я хочу, чтобы добавить новый столбец MaxValueVar, который возвращает индекс столбца, который имеет максимальное значение среди var1, var2 и var3. То есть, я хочу составить таблицу, как показано ниже.

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

В R я хотел бы использовать:

apply(vector, 1, which.max) 

Как я могу сделать это, используя SAS?

+0

Ваш вопрос с просьбой о том, как добиться этого в SAS ? – Dason

+0

@Dason Right. Извините, мой вопрос был путаным. –

+0

Что вы хотите делать с отсутствующими данными? И как вы хотите относиться к связям для максимума (т. Е. - если у вас есть два экземпляра из 60 в первой строке)? Это немного повлияет на потенциальные ответы. – thelatemail

ответ

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 Спасибо, Робби_Лю. Но я не могу понять «i * (maxvalue = vars (i))». Можете ли вы объяснить больше? –

+0

@Robbie_Liu (maxvalue = vars (i)) <- Эта часть означает фразу «Если»? –

+0

Его можно переписать как 'if maxvaluevar = 0 и maxvalue = vars (i), затем maxvaluevar = i;' –

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. Но у меня есть вопрос. Что такое «отпуск»? Я проверил, что ваш код работал надлежащим образом без «отпуска». –

+0

Он просто останавливает цикл от продолжения в прошлом, где он нам нужен, выбирая первое совпадение, которое он видит. Если бы я не использовал 'leave', он обработал весь массив, и последнее совпадение будет возвращено. – cmjohns

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

Благодарим вас за дополнительную помощь в проверке количества столбцов с одинаковыми максимальными значениями. –

+0

@TaeHeonKim - Без проблем, рад помочь - не забудьте проголосовать и выбрать принятый ответ (не обязательно мой!) – thelatemail