2011-11-22 9 views
5

Mam ramki danych z następującymi danymi:Czy jest coś takiego jak indeks 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) 

Funkcja pmax pozwala mi uzyskać maksymalną wartość dla tego rekordu, ale zastanawiałem się, w jaki sposób mogę uzyskać indeks maksymalnej wartości dla tego rekordu .

gdzie z $ max wyniesie 7,8,9,6,8,8, chciałbym dostać 5,5,5,3,3,5

Czy to możliwe? Wiem, że to wygląda na coś prostego, ale nigdzie nie mogę znaleźć odpowiedzi.

Odpowiedz

3

Bardzo prosty w podstawowej R:

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

Faktycznie, który daje 1 mniej niż to, co zostało z prośbą o odkąd wykluczyć pierwszą kolumnę, ale które mogą być łatwo usunięte przez dodanie jednego.

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

Dzięki, działa również z who.min, które okażą się przydatne! – thequerist

13

Można użyć 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 

myślę, to znaczy, że chciał indeks jednak użyć tylko 4 wektory tam, tak aby znaleźć to, co chcesz, to trzeba znaleźć indeks i następnie dodaj 1.

+0

Dzięki, bardzo proste. – thequerist

+2

Nie zapomnij przejrzeć dokumentacji, ponieważ ta funkcja ma argument 'ties.method = c (" random "," first "," last ")' i domyślnie używa metody 'random'. – Galled

+0

Tak, widziałem to, ale dziękuję za wskazanie tego. – thequerist