Câu hỏi Tìm chỉ mục hàng chứa giá trị lớn nhất bằng R


Do ma trận sau cho phép 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ẽ quay trở lại 8. Làm thế nào tôi có thể trả về chỉ số hàng, trong trường hợp này là hàng thứ hai?


112
2018-04-13 11:13


gốc




Các câu trả lời:


Xem ?which.max

> which.max( matrix[,2] )
[1] 2

159
2018-04-13 11:44





Xem ?order. Bạn chỉ cần chỉ mục cuối cùng (hoặc thứ nhất, theo thứ tự giảm dần), do đó, điều này nên thực hiện thủ thuật:

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

26
2018-04-13 11:33



1 Tôi thích câu trả lời này bởi vì nó cho phép tôi dễ dàng nhìn vào số ít nhất, thay vì chỉ là số tối đa. Tôi đã tìm thấy nó hữu ích cho việc tìm kiếm ngày của các giá trị gần tối đa từ một cột khác. - djhocking
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ử that.max con số ra tối đa? : p - Nick Ulle
Không phân loại, tất nhiên. Tìm ra nhu cầu tối đa O (n), sắp xếp đòi hỏi nhiều thời gian hơn :) - bartektartanus
Tôi đã nhầm lẫn giữa thứ hạng và thứ tự. order trả về chỉ mục mà mỗi phần tử có, nhưng được sắp xếp theo giá trị của các phần tử. rank trả về chỉ mục mỗi phần tử sẽ có, nếu danh sách được sắp xếp trước. Như vậy order trả về các giá trị chỉ mục hiện tại; và được sử dụng như một "người lập chỉ mục" trong các thuật ngữ gấu trúc. - The Red Pea


Làm thế nào về sau đây, trong đó y là tên của ma trận của bạn và bạn đang tìm kiếm tối đa 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 được 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 kỳ thứ gì bạn cần. Ngoài ra, 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 cột tối đa trong một cột cụ thể, hãy nói 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 là linh hoạt để tìm các yêu cầu khác nhau.

Xem phần tuyệt vời của Phil Spector "Giới thiệu về S và S-Plus" Chương 5 để có thêm ý tưởng.


1
2017-11-09 17:07