2009-11-06 13 views
94

Desidero filtrare le righe da data.frame in base a una condizione logica. Supponiamo che io ho frame di dati comeFiltra righe data.frame per condizione logica

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 

Quello che voglio è quello di ottenere una nuova cornice di dati che sembra lo stesso, ma ha solo i dati per un cell_type. Per esempio. sottoinsieme/selezionare i file che contiene il tipo di cellula "hESC":

expr_value  cell_type 
1 5.929771   hesc 
2 5.873096   hesc 
3 5.665857   hesc 

O entrambi i tipi di cellule "BJ fibroblasti" o "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 

Esiste un modo semplice per farlo?

ho provato:

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

se il frame di dati originale è chiamato "expr", ma dà i risultati in formato sbagliato, come si può vedere.

risposta

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

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

Essere consapevoli del fatto che il '' == funzione può raccogliere qualsiasi NA registra così come "hESC" , mentre '% in %' non lo farà. –

+1

@Matt quando si utilizza 'sottoinsieme' questo funziona come previsto. –

70

Uso subset (per uso interattivo)

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

o meglio dplyr::filter()

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

Attenzione! La documentazione di 'subset' ha un grande AVVISO:" Questa è una funzione di convenienza intesa per l'uso in modo interattivo. Per la programmazione è meglio usare le funzioni di subsetting standard come [, ed in particolare la valutazione dell'argomento non standard d argomento * può avere conseguenze impreviste ces. " –

27

La ragione expr[expr[2] == 'hesc'] non funziona è che per un frame di dati, x[y] seleziona colonne, non filari. Se si desidera selezionare le righe, cambiare alla sintassi x[y,] invece:

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

è possibile utilizzare il pacchetto dplyr:

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

A volte la colonna che si desidera filtrare possono apparire in una posizione diversa da quella colonna indice 2 o avere un nome di variabile.

In questo caso, si può semplicemente fare riferimento il nome della colonna si desidera filtrare come:

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