Menemukan indeks baris yang mengandung nilai maksimum dengan menggunakan R

117

Diberikan matriks berikut mari kita asumsikan saya ingin menemukan nilai maksimum di kolom dua:

mat <- matrix(c(1:3,7:9,4:6), byrow = T, nc = 3)
mat
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    7    8    9
[3,]    4    5    6

Saya tahu max(mat[,2])akan mengembalikan 8. Bagaimana saya bisa mengembalikan indeks baris, dalam hal ini baris dua?

Jared
sumber

Jawaban:

167

Lihat ?which.max

> which.max( matrix[,2] )
[1] 2
Danko Durbić
sumber
27

Lihat ?order. Anda hanya perlu indeks terakhir (atau yang pertama, dalam urutan menurun), jadi ini triknya:

order(matrix[,2],decreasing=T)[1]
yoyoyoyosef
sumber
5
+1 Saya menyukai jawaban ini karena memungkinkan saya untuk dengan mudah melihat beberapa teratas, bukan hanya maks. Saya merasa berguna untuk mencari tanggal mendekati nilai maksimal dari kolom lain.
djhocking
7
Namun perlu diingat bahwa ini lebih lambat dari yang. Maks, karena Anda perlu mengurutkan seluruh kolom :)
bartektartanus
@bartektartanus Dan bagaimana menurut Anda which.max menggambarkan max? : p
Nick Ulle
10
Tanpa memilah, tentunya. Mencari tahu kebutuhan maksimal O (n), menyortir membutuhkan lebih banyak waktu :)
bartektartanus
Saya bingung antara pangkat dan ketertiban. ordermengembalikan indeks yang dimiliki setiap elemen, tetapi diurutkan berdasarkan nilai elemen. rankmengembalikan indeks yang akan dimiliki setiap elemen , jika daftar diurutkan terlebih dahulu. Dengan demikian ordermengembalikan nilai indeks saat ini; dan digunakan sebagai "pengindeks" dalam istilah pandas.
The Red Pea
2

Bagaimana dengan yang berikut ini, dimana y adalah nama dari matriks anda dan anda sedang mencari nilai maksimum di seluruh matriks:

row(y)[y==max(y)]

jika Anda ingin mengekstrak baris:

y[row(y)[y==max(y)],] # this returns unsorted rows.

Untuk mengembalikan baris yang diurutkan, gunakan:

y[sort(row(y)[y==max(y)]),]

Keuntungan dari pendekatan ini adalah Anda dapat mengubah bagian dalam bersyarat menjadi apa pun yang Anda butuhkan. Selain itu, menggunakan col(y)dan lokasi tanda koma gantung Anda juga dapat mengekstrak kolom.

y[,col(y)[y==max(y)]]

Untuk menemukan hanya baris untuk maks di kolom tertentu, katakan kolom 2, Anda dapat menggunakan:

seq(along=y[,2])[y[,2]==max(y[,2])]

lagi-lagi persyaratannya fleksibel untuk mencari persyaratan yang berbeda.

Lihat Bab 5 "Pengantar S dan S-Plus" yang sangat baik dari Phil Spector untuk gagasan tambahan.

QFanatic
sumber