Lọc các hàng data.frame theo một điều kiện logic


155

Tôi muốn lọc các hàng từ data.framedựa trên một điều kiện hợp lý. Giả sử tôi có khung dữ liệu như

   expr_value     cell_type
1    5.345618 bj fibroblast
2    5.195871 bj fibroblast
3    5.247274 bj fibroblast
4    5.929771          hesc
5    5.873096          hesc
6    5.665857          hesc
7    6.791656          hips
8    7.133673          hips
9    7.574058          hips
10   7.208041          hips
11   7.402100          hips
12   7.167792          hips
13   7.156971          hips
14   7.197543          hips
15   7.035404          hips
16   7.269474          hips
17   6.715059          hips
18   7.434339          hips
19   6.997586          hips
20   7.619770          hips
21   7.490749          hips

Điều tôi muốn là có được một khung dữ liệu mới trông giống nhau nhưng chỉ có dữ liệu cho một cell_type. Ví dụ: tập hợp con / chọn các hàng có chứa loại ô "ngần ngại":

   expr_value     cell_type
1    5.929771          hesc
2    5.873096          hesc
3    5.665857          hesc

Hoặc loại tế bào "bj fibroblast" hoặc "ngần ngại":

   expr_value     cell_type
1    5.345618 bj fibroblast
2    5.195871 bj fibroblast
3    5.247274 bj fibroblast
4    5.929771          hesc
5    5.873096          hesc
6    5.665857          hesc

Có cách nào dễ dàng để làm điều này?

Tôi đã thử:

expr[expr[2] == 'hesc']
# [1] "5.929771" "5.873096" "5.665857" "hesc"     "hesc"     "hesc"    

nếu khung dữ liệu gốc được gọi là "expr", nhưng nó cho kết quả ở định dạng sai như bạn có thể thấy.

Câu trả lời:


210

Để chọn các hàng theo một 'cell_type' (ví dụ: 'ngần ngại'), hãy sử dụng ==:

expr[expr$cell_type == "hesc", ]

Để chọn các hàng theo hai hoặc nhiều 'cell_type' khác nhau, (ví dụ:'youc ' hoặc ' bj fibroblast '), hãy sử dụng %in%:

expr[expr$cell_type %in% c("hesc", "bj fibroblast"), ]

28
Xin lưu ý rằng ==chức năng này sẽ nhận bất kỳ bản ghi NA nào cũng như "ngần ngại", trong khi %in%sẽ không.
Matt Parker

Tôi tự hỏi nếu điều này làm việc bây giờ? Tôi không thể đặt tập hợp dữ liệu dựa trên điều kiện theo cách này.
Sumanth Lazarus

85

Sử dụng subset(để sử dụng tương tác)

subset(expr, cell_type == "hesc")
subset(expr, cell_type %in% c("bj fibroblast", "hesc"))

hoặc tốt hơn dplyr::filter()

filter(expr, cell_type %in% c("bj fibroblast", "hesc"))

37
Cẩn thận! Tài liệu của subsetcó một CẢNH BÁO lớn: "Đây là một chức năng tiện lợi dành cho việc sử dụng một cách tương tác. Để lập trình, tốt hơn là sử dụng các hàm tập hợp tiêu chuẩn như [, và đặc biệt là việc đánh giá tập hợp đối số không phụ thuộc có thể có các kết quả không lường trước được . "
Aleksandar Dimitrov

33

Lý do expr[expr[2] == 'hesc']không hoạt động là vì khung dữ liệu, x[y]chọn các cột, không phải các hàng. Nếu bạn muốn chọn hàng, thay vào đó là cú pháp x[y,]:

> expr[expr[2] == 'hesc',]
  expr_value cell_type
4   5.929771      hesc
5   5.873096      hesc
6   5.665857      hesc

Điều này sẽ nhận bất kỳ NAhồ sơ là tốt! Do đó, không áp dụng. Lý do có vẻ đúng là do thực tế là khung dữ liệu expr không có NAtrong cột được lọc. Nếu có NA, cách của bạn không được áp dụng như tôi đã nói trước đây.
Erdogan CEVHER

26

Bạn có thể sử dụng dplyrgói:

library(dplyr)
filter(expr, cell_type == "hesc")
filter(expr, cell_type == "hesc" | cell_type == "bj fibroblast")

5

Không ai có vẻ đã bao gồm các chức năng. Nó cũng có thể chứng minh hữu ích cho việc lọc.

expr[which(expr$cell == 'hesc'),]

Điều này cũng sẽ xử lý NA và thả chúng từ khung dữ liệu kết quả.

Chạy chương trình này trên 9840 x 24 dataframe 50000 lần, có vẻ như phương thức nào có thời gian chạy nhanh hơn 60% so với phương thức% in%.


4

Tôi đã làm việc trên một khung dữ liệu và không gặp may mắn với các câu trả lời được cung cấp, nó luôn trả về 0 hàng, vì vậy tôi đã tìm và sử dụng grepl:

df = df[grepl("downlink",df$Transmit.direction),]

Về cơ bản, cắt bớt khung dữ liệu của tôi thành chỉ các hàng có chứa "đường xuống" trong cột Hướng truyền. Tái bút Nếu ai đó có thể đoán được tại sao tôi không thấy hành vi dự kiến, vui lòng để lại nhận xét.

Cụ thể cho câu hỏi ban đầu:

expr[grepl("hesc",expr$cell_type),]

expr[grepl("bj fibroblast|hesc",expr$cell_type),]

3

Đôi khi, cột bạn muốn lọc có thể xuất hiện ở một vị trí khác với chỉ số cột 2 hoặc có tên biến.

Trong trường hợp này, bạn chỉ cần tham khảo tên cột bạn muốn lọc là:

columnNameToFilter = "cell_type"
expr[expr[[columnNameToFilter]] == "hesc", ]

Điều này sẽ nhận bất kỳ NAhồ sơ là tốt! Do đó, không áp dụng.
Erdogan CEVHER

0

chúng ta có thể sử dụng thư viện data.table

  library(data.table)
  expr <- data.table(expr)
  expr[cell_type == "hesc"]
  expr[cell_type %in% c("hesc","fibroblast")]

hoặc bộ lọc sử dụng %like%toán tử để khớp mẫu

 expr[cell_type %like% "hesc"|cell_type %like% "fibroblast"]

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.