Chọn các hàng của ma trận đáp ứng điều kiện


144

Trong R với một ma trận:

     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

Tôi muốn trích xuất hàm con có các hàng có cột ba = 11. Đó là:

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

Tôi muốn làm điều này mà không cần lặp. Tôi mới sử dụng R nên điều này có lẽ rất rõ ràng nhưng tài liệu thường có phần ngắn gọn.


4
Ý tưởng cơ bản trong mọi câu trả lời là nếu bạn có một vectơ / ma trận logic (TRUE và FALSE) có cùng độ dài với một số chỉ mục, bạn sẽ chỉ chọn các trường hợp là TRUE. Chạy mã giữa [ ]trong các câu trả lời và bạn sẽ thấy điều này rõ ràng hơn.
Sacha Epskamp

Câu trả lời:


160

Điều này dễ thực hiện hơn nếu bạn chuyển đổi ma trận của mình sang khung dữ liệu bằng as.data.frame (). Trong trường hợp đó, các câu trả lời trước (sử dụng tập hợp con hoặc m $ ba) sẽ hoạt động, nếu không thì không.

Để thực hiện thao tác trên ma trận , bạn có thể xác định một cột theo tên:

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

Hoặc theo số:

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

Lưu ý rằng nếu chỉ có một hàng khớp, kết quả là một vectơ số nguyên, không phải là ma trận.


19
nếu bạn cần giữ ma trận, thì hãy làmm[m[,3] == 11,,drop=FALSE]
Joris Meys 22/03/2016

@neilfws Điều gì sẽ là giải pháp nếu tôi muốn xác định một số giá trị cho một phạm vi cột. Ví dụ df <- df[!which(df$ARID3A:df$YY1 == "U"),], ở đây tôi muốn loại bỏ những hàng từ df của tôi, nơi một loạt các cột (ARID3A: YY1) chứa giá trị U .
Newbie

Làm thế nào điều này hoạt động nếu bạn không muốn chỉ định tên cột mà muốn làm việc trên tất cả các cột trong ma trận?
dùng5359531

Xin chào @neilfws, làm thế nào bạn có thể thêm && câu lệnh này? Tôi cần nhận được hai giá trị cột cùng một lúc?
gỡ lỗi XD

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

Lệnh sau sẽ chọn hàng đầu tiên của ma trận ở trên.

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

Và điều này sẽ chọn ba cuối cùng.

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

Kết quả sẽ là một ma trận trong cả hai trường hợp. Nếu bạn muốn sử dụng tên cột để chọn cột thì tốt nhất bạn nên chuyển đổi nó thành một khung dữ liệu với

mf <- data.frame(m)

Sau đó, bạn có thể chọn với

mf[ mf$a == 16, ]

Hoặc, bạn có thể sử dụng lệnh tập hợp con.


21

Tôi sẽ chọn một cách tiếp cận đơn giản bằng cách sử dụng gói dplyr.

Nếu khung dữ liệu là dữ liệu.

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

11

Tập hợp con là một chức năng rất chậm, và cá nhân tôi thấy nó vô dụng.

Tôi giả sử bạn có một data.frame, mảng, ma trận được gọi Matvới A, B, Cnhư tên cột; sau đó, tất cả những gì bạn cần làm là:

  • Trong trường hợp có một điều kiện trên một cột, giả sử cột A

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

Trong trường hợp có nhiều điều kiện trên cột khác nhau, bạn có thể tạo một biến giả. Giả sử các điều kiện là A = 10, B = 5C > 2, sau đó chúng ta có:

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

Bằng cách kiểm tra lợi thế tốc độ với system.time, whichphương pháp nhanh hơn gấp 10 lần so với subsetphương pháp.


6

Nếu ma trận của bạn được gọi m, chỉ cần sử dụng:

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

@juba Điều gì sẽ là giải pháp nếu tôi muốn xác định một số giá trị cho một phạm vi cột. ví dụ: df <- df[!which(df$ARID3A:df$YY1 == "U"),]ở đây tôi muốn xóa các hàng đó khỏi df ​​của mình trong đó một phạm vi cột (ARID3A: YY1) chứa giá trịU
Newbie

0

Nếu tập dữ liệu được gọi là dữ liệu, thì tất cả các hàng đáp ứng điều kiện trong đó giá trị của cột 'pm2,5'> 300 có thể được nhận bởi -

dữ liệu [dữ liệu ['pm2,5]]> 300,]

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.