Поиск индекса строки, содержащей максимальное значение, с помощью R

117

Учитывая следующую матрицу, предположим, что я хочу найти максимальное значение во втором столбце:

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. Как мне вернуть индекс строки, в данном случае строку два?

Джаред
источник

Ответы:

167

Видеть ?which.max

> which.max( matrix[,2] )
[1] 2
Данко Дурбич
источник
27

Смотрите ?order. Вам просто нужен последний индекс (или первый в порядке убывания), так что это должно помочь:

order(matrix[,2],decreasing=T)[1]
yoyoyoyosef
источник
5
+1 Мне нравится этот ответ, потому что он позволяет мне легко смотреть на несколько лучших, а не только на максимум. Я нашел его полезным для поиска дат близких к максимальным значениям из другого столбца.
djhocking
7
Но имейте в виду, что это медленнее, чем which.max, потому что вам нужно отсортировать весь столбец :)
bartektartanus
@bartektartanus А как вы предполагаете, which.max вычисляет максимум? : p
Ник Улле
10
Без сортировки, конечно. Чтобы определить максимальное значение O (n), сортировка требует больше времени :)
bartektartanus
Я запуталась между званием и порядком. orderвозвращает индекс, который имеет каждый элемент, но отсортированный по значению элементов. rankвозвращает индекс, который имел бы каждый элемент , если бы список был отсортирован первым. Таким образом orderвозвращает текущие значения индекса; и использоваться в качестве «индексатора» в терминах панд.
The Red Pea
2

Как насчет следующего, где y - это имя вашей матрицы, и вы ищете максимум во всей матрице:

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

если вы хотите извлечь строку:

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

Чтобы вернуть отсортированные строки, используйте:

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

Преимущество этого подхода в том, что вы можете изменить условное выражение внутри на все, что вам нужно. Кроме того, используя col(y)и расположение висячей запятой, вы также можете извлекать столбцы.

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

Чтобы найти только строку для максимума в определенном столбце, скажем, в столбце 2, вы можете использовать:

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

опять же, условное выражение гибко, чтобы искать различные требования.

Дополнительные идеи см. В превосходной главе 5 «Введение в S и S-Plus» Фила Спектора.

QFanatic
источник