2009-11-06 4 views
94

Je souhaite filtrer les lignes d'un data.frame en fonction d'une condition logique. Supposons que je trame de données commeFiltrer les lignes de données.en fonction d'une condition logique

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 

Ce que je veux est d'obtenir une nouvelle trame de données qui semble la même, mais ne dispose que des données pour une cell_type. Par exemple. sous-ensemble/sélectionner des lignes qui contient le type de cellule « CSEh »:

expr_value  cell_type 
1 5.929771   hesc 
2 5.873096   hesc 
3 5.665857   hesc 

Ou les deux types de cellules « fibroblaste bj » ou « CSEh »:

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 

est-il un moyen facile de faire cela?

J'ai essayé:

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

si la trame de données d'origine est appelé « expr », mais il donne les résultats au mauvais format que vous pouvez voir.

Répondre

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

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

Sachez que la fonction '==' prendra tous les NA enregistre ainsi que « CSEh » , alors que "% in%" ne le sera pas. –

+1

@Matt lors de l'utilisation de 'subset' cela fonctionne comme prévu. –

70

utilisation subset (pour une utilisation interactive)

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

ou mieux dplyr::filter()

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

Attention! La documentation de 'subset' a un gros avertissement:" Il s'agit d'une fonction de commodité destinée à être utilisée interactivement.Pour la programmation, il vaut mieux utiliser les fonctions standard de sous-ensembles comme [, et en particulier le non-standar d * peut avoir des conséquences imprévues ces. " –

27

La raison expr[expr[2] == 'hesc'] ne fonctionne pas est que pour une trame de données, x[y] sélectionne des colonnes, pas lignes Si vous souhaitez sélectionner des lignes, changer à la syntaxe x[y,] à la place:

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

Vous pouvez utiliser le package dplyr:

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

Parfois, la colonne que vous souhaitez filtrer peut apparaître dans une position différente de celle colonne index 2 ou avoir un nom de variable.

Dans ce cas, vous pouvez simplement renvoyer le nom de la colonne que vous souhaitez filtrer comme:

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