เลือกแถวของเมทริกซ์ที่ตรงตามเงื่อนไข


144

ใน R ด้วยเมทริกซ์:

     one two three four
 [1,]   1   6    11   16
 [2,]   2   7    12   17
 [3,]   3   8    11   18
 [4,]   4   9    11   19
 [5,]   5  10    15   20

ฉันต้องการแยก submatrix ที่แถวมีคอลัมน์สาม = 11 นั่นคือ:

      one two three four
 [1,]   1   6    11   16
 [3,]   3   8    11   18
 [4,]   4   9    11   19

ฉันต้องการทำสิ่งนี้โดยไม่ต้องวนซ้ำ ฉันใหม่กับ R ดังนั้นนี่อาจชัดเจนมาก แต่เอกสารมักจะค่อนข้างสั้น


4
แนวคิดพื้นฐานในทุกคำตอบคือถ้าคุณมีเวกเตอร์ / เมทริกซ์เชิงตรรกะ (TRUEs และ FALSEs) ที่มีความยาวเท่ากับดัชนีบางตัวคุณจะเลือกเฉพาะกรณีที่เป็น TRUE เรียกใช้รหัสระหว่าง[ ]ในคำตอบและคุณจะเห็นสิ่งนี้ชัดเจนยิ่งขึ้น
Sacha Epskamp

คำตอบ:


160

วิธีนี้จะง่ายกว่าถ้าคุณแปลงเมทริกซ์ของคุณเป็น data frame โดยใช้ as.data.frame () ในกรณีนั้นคำตอบก่อนหน้า (การใช้ชุดย่อยหรือ m $ สาม) จะใช้งานไม่ได้

ในการดำเนินการกับเมทริกซ์คุณสามารถกำหนดคอลัมน์ตามชื่อ:

m[m[, "three"] == 11,]

หรือตามหมายเลข:

m[m[,3] == 11,]

โปรดทราบว่าหากมีเพียงหนึ่งแถวที่ตรงกันผลลัพธ์จะเป็นเวกเตอร์จำนวนเต็มไม่ใช่เมทริกซ์


19
ถ้าคุณต้องการรักษาเมทริกซ์ให้ทำm[m[,3] == 11,,drop=FALSE]
Joris Meys

@neilfws จะแก้ปัญหาอย่างไรหากฉันต้องการกำหนดค่าบางอย่างสำหรับช่วงของคอลัมน์ ตัวอย่างเช่นdf <- df[!which(df$ARID3A:df$YY1 == "U"),]ที่นี่ฉันต้องการที่จะลบแถวเหล่านั้นจาก DF ของฉันที่หลากหลายของคอลัมน์ (ARID3A: YY1) ประกอบด้วยค่าU
Newbie

มันทำงานอย่างไรถ้าคุณไม่ต้องการระบุชื่อคอลัมน์เลย แต่ต้องการทำงานกับคอลัมน์ทั้งหมดในเมทริกซ์
user5359531

สวัสดี @neilfws คุณจะเพิ่มคำสั่ง && ลงในส่วนนี้ได้อย่างไร ฉันต้องการรับค่าสองคอลัมน์พร้อมกันหรือไม่
ดีบัก XD

28
m <- matrix(1:20, ncol = 4) 
colnames(m) <- letters[1:4]

คำสั่งต่อไปนี้จะเลือกแถวแรกของเมทริกซ์ด้านบน

subset(m, m[,4] == 16)

และนี่จะเลือกสามอันสุดท้าย

subset(m, m[,4] > 17)

ผลลัพธ์จะเป็นเมทริกซ์ในทั้งสองกรณี หากคุณต้องการใช้ชื่อคอลัมน์เพื่อเลือกคอลัมน์คุณควรทำการแปลงให้เป็นชื่อดาต้าเบสด้วย

mf <- data.frame(m)

จากนั้นคุณสามารถเลือกด้วย

mf[ mf$a == 16, ]

หรือคุณสามารถใช้คำสั่งชุดย่อย


21

ฉันจะเลือกวิธีง่าย ๆ โดยใช้แพ็คเกจ dplyr

หาก dataframe คือ data

library(dplyr)
result <- filter(data, three == 11)

11

เซตย่อยเป็นฟังก์ชั่นที่ช้ามากและฉันพบว่ามันไร้ประโยชน์

ผมถือว่าคุณมี data.frame อาร์เรย์เมทริกซ์ที่เรียกว่าMatมีA, B, Cเป็นชื่อคอลัมน์; สิ่งที่คุณต้องทำคือ:

  • ในกรณีที่มีเงื่อนไขเดียวในหนึ่งคอลัมน์ให้พูดคอลัมน์ A

    Mat[which(Mat[,'A'] == 10), ]

ในกรณีที่มีหลายเงื่อนไขในคอลัมน์ที่แตกต่างกันคุณสามารถสร้างตัวแปรจำลองได้ สมมติว่าเงื่อนไขที่จะA = 10, B = 5และC > 2แล้วเรามี:

    aux = which(Mat[,'A'] == 10)
    aux = aux[which(Mat[aux,'B'] == 5)]
    aux = aux[which(Mat[aux,'C'] > 2)]
    Mat[aux, ]

โดยการทดสอบประโยชน์ความเร็วsystem.timeที่whichเป็นวิธีการที่ 10x เร็วกว่าsubsetวิธีการ


6

หากเมทริกซ์ของคุณถูกเรียกmใช้เพียง:

R> m[m$three == 11, ]

@juba จะแก้ปัญหาอย่างไรหากฉันต้องการกำหนดค่าบางอย่างสำหรับช่วงของคอลัมน์ ตัวอย่างเช่นdf <- df[!which(df$ARID3A:df$YY1 == "U"),]ที่นี่ฉันต้องการลบแถวเหล่านั้นออกจาก df โดยที่ช่วงของคอลัมน์ (ARID3A: YY1) มีค่าU
Newbie

0

หากชุดข้อมูลนั้นเรียกว่า data ดังนั้นทุกแถวจะมีเงื่อนไขว่าค่าของคอลัมน์ 'pm2.5'> 300 สามารถรับได้โดย -

data [data ['pm2.5']> 300,]

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