Пошук індексу рядків, що містить максимальне значення, використовуючи 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. Як я можу повернути індекс рядків, у цьому випадку другий рядок?

Відповіді:



27

Див ?order. Вам просто потрібен останній індекс (або перший, у порядку зменшення), тому для цього слід зробити фокус:

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

5
+1 Мені подобається ця відповідь, тому що вона дозволяє мені легко переглядати топ-кілька, а не лише максимум. Я вважаю корисним шукати дати найближчих максимальних значень з іншого стовпця.
djhocking

7
Але майте на увазі, що це повільніше, ніж what.max, тому що вам потрібно сортувати цілий стовпець :)
bartektartanus

@bartektartanus А як ви вважаєте, який файл.max визначає максимум? : p
Нік Улле

10
Без сортування, звичайно. Виявлення максимальних потреб O (n), сортування вимагає більше часу :)
bartektartanus

Я заплутався між рангом і порядком. orderповертає індекс, який має кожен елемент, але відсортований за значенням елементів. rankповертає індекс, який би мав кожен елемент , якби список був відсортований першим. Таким чином orderповертає поточні значення індексу; і використовуватиметься як "індексатор" у термінах панд.
Червоний горох

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])]

знову ж умовний гнучкість для пошуку різних вимог.

Докладні ідеї дивіться у чудовому «Вступ до S та S-Plus» Розділу 5 Філа Спектора.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.