2009-11-06 34 views
94

Tôi muốn lọc các hàng từ một số data.frame dựa trên điều kiện lôgic. Giả sử rằng tôi có khung dữ liệu nhưLọc dữ liệu.hàng các hàng theo điều kiện logic

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ó 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 hàng chứa các loại tế bào "hESC":

expr_value  cell_type 
1 5.929771   hesc 
2 5.873096   hesc 
3 5.665857   hesc 

Hoặc một trong hai loại tế bào "bj nguyên bào sợi" hoặc "hESC":

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 được đ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 ban đầu được gọi là "expr", nhưng nó mang lại các kết quả trong định dạng sai như bạn có thể nhìn thấy.

Trả lời

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

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

Hãy nhận biết rằng '==' chức năng sẽ nhận bất kỳ NA ghi lại cũng như "hESC" , trong khi '% trong%' thì không. –

+1

@Matt khi sử dụng 'tập hợp con' hoạt động như mong đợi. –

70

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")) 
+28

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

27

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

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

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

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

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

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

columnNameToFilter = "cell_type" 
expr[expr[[columnNameToFilter]] == "hesc", ] 
Các vấn đề liên quan