2011-11-22 4 views
5

Ho un frame di dati con i seguenti dati:C'è qualcosa come un indice pmax?

date=strptime(c(20110101,20110102,20110103,20110104,20110105,20110106),'%Y%m%d') 
rate1=c(1,2,3,4,5,6) 
rate2=c(2,1,3,6,8,4) 
rate3=c(4,1,3,6,8,3) 
rate4=c(7,8,9,2,1,8) 
z=data.frame(date,rate1,rate2,rate3,rate4) 
z$max=pmax(rate1,rate2,rate3,rate4) 

La funzione pmax mi permette di ottenere il massimo valore per il record, ma mi chiedevo come posso ottenere l'indice del valore massimo per il record .

dove Z $ max sarebbe pari 7,8,9,6,8,8, vorrei ottenere 5,5,5,3,3,5

è possibile? So che questo sembra qualcosa di semplice ma non riesco a trovare la risposta da nessuna parte.

risposta

3

Molto semplice nella base di R:

z$wmax <- apply(z[, -c(1,6)],1, which.max) 

realtà che ti dà 1 meno di quello che stavi chiedendo da quando ho escluso la prima colonna, ma che può essere risolto facilmente con l'aggiunta di uno.

z$max_col_n <- apply(z[, -c(1,6)],1, which.max) +1 
+0

Grazie, funziona anche con which.min che si rivelerà utile! – thequerist

13

Si potrebbe utilizzare max.col:

> z$max = max.col(z[2:5])+1 
> z 
     date rate1 rate2 rate3 rate4 max 
1 2011-01-01  1  2  4  7 5 
2 2011-01-02  2  1  1  8 5 
3 2011-01-03  3  3  3  9 5 
4 2011-01-04  4  6  6  2 3 
5 2011-01-05  5  8  8  1 3 
6 2011-01-06  6  4  3  8 5 

Credo che si intende che volevi l'indice ma usare solo 4 vettori lì, in modo da trovare ciò che si vuole, si dovrà trovare l'indice e quindi aggiungi 1.

+0

Grazie, molto semplice. – thequerist

+2

Non dimenticare di rivedere la documentazione perché quella funzione ha un argomento 'ties.method = c (" random "," first "," last ")' e per default usa il metodo 'random'. – Galled

+0

Sì, l'ho visto, ma grazie per averlo indicato. – thequerist