การค้นหาดัชนีแถวที่มีค่าสูงสุดโดยใช้ 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
แต่โปรดทราบว่าช้ากว่าซึ่งสูงสุดเพราะคุณต้องเรียงลำดับทั้งคอลัมน์ :)
bartektartanus

@bartektartanus และคุณคิดว่า which.max คิดค่าสูงสุดได้อย่างไร? : p
Nick Ulle

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

อีกครั้งเงื่อนไขมีความยืดหยุ่นในการค้นหาข้อกำหนดที่แตกต่างกัน

ดู "บทนำสู่ S และ S-Plus" ที่ยอดเยี่ยมของ Phil Spector บทที่ 5 สำหรับแนวคิดเพิ่มเติม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.