2009-11-06 20 views
94

Chcę filtrować wiersze od data.frame w oparciu o warunek logiczny. Załóżmy, że mam ramkę danych jakFiltruj dane.ramki klatek według stanu logicznego

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 

co chcę to dostać nową ramkę danych, który wygląda tak samo, ale ma tylko dane dla jednej cell_type. Na przykład. podzbiór/wybierz wiersze, które zawiera typ komórek "HESC":

expr_value  cell_type 
1 5.929771   hesc 
2 5.873096   hesc 
3 5.665857   hesc 

albo z typu komórek "bj fibroblastów" lub "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 

Czy istnieje prosty sposób to zrobić?

Próbowałem:

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

jeśli oryginalna ramka danych jest nazywany „wyrażenie”, ale daje wyniki w złym formacie, jak widać.

Odpowiedz

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

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

Należy pamiętać, że '' == funkcja będzie odebrać żadnego NA nagrywa także jako „ludzkich zarodkowych komórek macierzystych” , natomiast '% w%' nie. –

+1

@Matt podczas używania 'podzbioru' działa zgodnie z oczekiwaniami. –

70

Zastosowanie subset (na interaktywne używanie)

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

lub lepiej dplyr::filter()

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

Ostrożnie! Dokumentacja 'podzbioru' ma duże OSTRZEŻENIE:" Jest to wygodna funkcja przeznaczona do interaktywnego użycia, do programowania lepiej używać standardowych funkcji podsekcji, takich jak [, aw szczególności niestandardowa analiza podzbioru argumentów *; * może mieć nieprzewidziane konsekwencje ces. " –

27

Powodem expr[expr[2] == 'hesc'] nie działa jest to, że dla ramki danych, x[y] wybiera kolumn, nie wydziwianie. Jeśli chcesz wybrać wiersze, zmienić składni x[y,] Zamiast:

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

Można użyć pakietu dplyr:

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

Czasami kolumna chcesz filtrować może pojawić się w innej pozycji niż kolumny indeks 2 lub nazwę zmiennej.

W tym przypadku można po prostu przekazać nazwę kolumny chcesz filtrować jako:

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