R kullanarak maksimum değeri içeren satır dizini bulma


117

Aşağıdaki matris verildiğinde, ikinci sütundaki maksimum değeri bulmak istediğimi varsayalım:

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

max(mat[,2])8 döneceğini biliyorum . Satır indeksini nasıl döndürebilirim, bu durumda ikinci satır?

Yanıtlar:



27

Bakın ?order. Sadece son dizine (veya azalan sırayla) ihtiyacınız var, bu yüzden hile yapmalı:

order(matrix[,2],decreasing=T)[1]

5
+1 Bu cevabı beğendim çünkü sadece maksimuma değil, ilk birkaçına kolayca bakmamı sağlıyor. Başka bir sütundaki maksimum değerlere yakın tarihlere bakmak için yararlı buldum.
djhocking

7
Ancak bunun which.max'tan daha yavaş olduğunu unutmayın çünkü tüm sütunu sıralamanız gerekiyor :)
bartektartanus

@bartektartanus Peki, which.max'ın max'ı nasıl çözdüğünü düşünüyorsunuz? : p
Nick Ulle

10
Elbette sıralama olmadan. Maksimum O (n) ihtiyacını bulmak, sıralama daha fazla zaman gerektirir :)
bartektartanus

Rütbe ve düzen arasında kafam karıştı. orderher öğenin sahip olduğu dizini döndürür, ancak öğelerin değerine göre sıralanır. Liste önce sıralanırsa rankher öğenin sahip olacağı dizini döndürür . Böylece ordermevcut indeks değerlerini döndürür; ve pandalar açısından bir "dizin oluşturucu" olarak kullanılabilir.
Kırmızı Bezelye

2

Şuna ne dersiniz, burada y matrisinizin adıdır ve tüm matris içinde maksimumu arıyorsunuz:

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

satırı çıkarmak istiyorsanız:

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

Sıralanmış satırları döndürmek için şunu kullanın:

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

Bu yaklaşımın avantajı, içerideki koşullu ifadeyi ihtiyacınız olan herhangi bir şeye değiştirebilmenizdir. Ayrıca, col(y)asılı virgülün yerini ve konumunu kullanarak da sütunları çıkarabilirsiniz.

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

Yalnızca belirli bir sütundaki maksimum satırını bulmak için 2. sütunu kullanabilirsiniz diyelim:

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

yine koşullu, farklı gereksinimleri aramak için esnektir.

Ek fikirler için Phil Spector'ın mükemmel "S ve S-Plus'a Giriş" 5. Bölümüne bakın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.