Lọc một khung dữ liệu


12

Vẫn học các hàm cơ bản trong R, Hàm tập hợp con dường như chỉ lọc dựa trên một điều kiện dựa trên một cột có hoặc không có nhiều điều kiện?

Làm cách nào tôi có thể dễ dàng lọc dữ liệu từ một khung dữ liệu?

  1. khi bạn được cung cấp nhiều điều kiện

  2. Khi điều kiện cần được áp dụng trên các cột có sẵn.

Ví dụ: Cho một khung dữ liệu chứa

name    D1      D2     D3      D4
julius  "A"     "A"    "B"     "B"
cate    "D"     "E"     "A"     "C"
karo    "A"     "D"     "C"     "E"

nói rằng tôi muốn lọc khung dữ liệu này để chỉ những tên trong đó bất kỳ từ D1 đến D4 nào là 'E' thì tôi nên có,

name    D1      D2     D3      D4
cate    "D"     "E"     "A"     "C"
karo    "A"     "D"     "C"     "E"

Giả sử D1 có thể là một danh sách lớn các cột, cách tiếp cận được đề xuất để thực hiện bộ lọc này là gì hoặc bằng cách nào? Cảm ơn bạn

Câu trả lời:


26

Nếu bạn muốn kết hợp một số bộ lọc trong chức năng tập hợp con, hãy sử dụng các toán tử logic:

 subset(data, D1 == "E" | D2 == "E")

sẽ chọn các hàng mà cột D1 hoặc cột D2 có giá trị "E". Nhìn vào các trang trợ giúp cho các toán tử logic có sẵn:

 > ?"|"

Đối với câu hỏi thứ hai của bạn, những gì bạn cần là lọc các hàng. Điều này có thể đạt được theo cách sau

 collist <- c("D1","D2","D3","D4")
 sel <- apply(data[,collist],1,function(row) "E" %in% row)
 data[sel,]

Đối số đầu tiên để áp dụng thay thế các cột mà chúng ta cần lọc. Đối số thứ hai là 1, có nghĩa là chúng ta đang lặp qua các hàng dữ liệu. Đối số thứ ba là hàm một dòng không được đặt tên sẽ trả về TRUE nếu "E" xuất hiện trong hàng và FALSE nếu không có "E".

Kết quả của áp dụng chức năng sẽ logic vector sel , trong đó có chiều dài tương tự như số lượng hàng trong dữ liệu. Sau đó chúng ta sử dụng vectơ này để chọn các hàng cần thiết.

Cập nhật

Điều tương tự có thể đạt được với grep:

sel <- apply(data[,collist],1,function(row) length(grep("E",row))>0)

trong R grep với các đối số mặc định trả về số lượng phần tử trong vectơ được cung cấp có mẫu phù hợp.


2
một chức năng hữu ích khác là any. Chẳng hạn, nếu bạn muốn kiểm tra xem có ít nhất một phần tử của vectơ là = 10bạn có thể viết ( any(v==10)).
nico

@nico yeah, nhưng 10% trong% v có 9 ký tự và biến thể với bất kỳ 10 :). Mặc dù đối với các vectơ số, tốt hơn là sử dụng đẳng thức, vì R là thông minh và nếu dữ liệu của bạn là số nguyên trộn với số thực, nó sẽ nhận ra chính xác rằng bạn có 10 trong tập dữ liệu của mình.
mpiktas

những gì về trường hợp cho biểu hiện thường xuyên? giả sử rằng bạn không muốn làm việc với một kết hợp chính xác? Họ có cái gì đó gần với ~ = như trong các ngôn ngữ khác không? những gì gần gũi nhất với biểu hiện đó trong R
winterafri

@Biorelated Xem grepagrep, và các tài liệu liên quan về regex tương thích POSIX 1003.2 hoặc Perl.
chl

@Biorelated, tôi đã cập nhật câu trả lời với ví dụ về grep.
mpiktas
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.