Tìm chỉ mục hàng chứa giá trị lớn nhất bằng cách sử dụng R


117

Với ma trận sau, giả sử tôi muốn tìm giá trị lớn nhất trong cột hai:

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

Tôi biết max(mat[,2])sẽ trả về 8. Làm cách nào để trả về chỉ mục hàng, trong trường hợp này là hàng hai?

Câu trả lời:



27

Thấy chưa ?order. Bạn chỉ cần chỉ mục cuối cùng (hoặc đầu tiên, theo thứ tự giảm dần), vì vậy điều này sẽ thực hiện thủ thuật:

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

5
+1 Tôi thích câu trả lời này vì nó cho phép tôi dễ dàng xem xét một số ít hàng đầu, thay vì chỉ là giá thầu tối đa. Tôi thấy nó hữu ích để tra cứu ngày của các giá trị gần cực đại từ một cột khác.
djhocking

7
Nhưng hãy nhớ rằng đây là chậm hơn so với which.max, bởi vì bạn cần phải sắp xếp toàn bộ cột :)
bartektartanus

@bartektartanus Và làm thế nào để bạn giả sử which.max tính toán giá trị tối đa? : p
Nick Ulle

10
Tất nhiên là không cần phân loại. Tìm hiểu những nhu cầu tối đa O (n), phân loại đòi hỏi thời gian nhiều hơn :)
bartektartanus

Tôi đã nhầm lẫn giữa cấp bậc và thứ tự. ordertrả về chỉ mục mà mỗi phần tử có, nhưng được sắp xếp theo giá trị của phần tử. ranktrả về chỉ mục mà mỗi phần tử sẽ có , nếu danh sách được sắp xếp trước. Do đó ordertrả về các giá trị chỉ mục hiện tại; và được sử dụng như một "chỉ mục" trong thuật ngữ gấu trúc.
The Red Pea

2

Còn phần sau thì sao, trong đó y là tên ma trận của bạn và bạn đang tìm giá trị lớn nhất trong toàn bộ ma trận:

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

nếu bạn muốn trích xuất hàng:

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

Để trả về các hàng đã sắp xếp, hãy sử dụng:

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

Ưu điểm của phương pháp này là bạn có thể thay đổi điều kiện bên trong thành bất cứ thứ gì bạn cần. Ngoài ra, bằng cách sử dụng col(y)và vị trí của dấu phẩy treo, bạn cũng có thể trích xuất các cột.

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

Để chỉ tìm hàng cho giá trị lớn nhất trong một cột cụ thể, giả sử cột 2 bạn có thể sử dụng:

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

một lần nữa, điều kiện có thể linh hoạt để tìm kiếm các yêu cầu khác nhau.

Xem Chương 5 "Giới thiệu về S và S-Plus" xuất sắc của Phil Spector để có thêm ý tưởng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.