186 votes

Filtrer les lignes d'un data.frame par une condition logique

Je souhaite filtrer les lignes d'un data.frame sur la base d'une condition logique. Supposons que j'aie un cadre de données comme

   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, c'est obtenir un nouveau cadre de données qui soit identique, mais qui ne contienne que les données d'un seul type de cellule. Par exemple, sous-ensemble / sélection des lignes qui contiennent le type de cellule "hesc" :

   expr_value     cell_type
1    5.929771          hesc
2    5.873096          hesc
3    5.665857          hesc

Ou le type de cellule "bj fibroblast" ou "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

Existe-t-il un moyen simple de procéder ?

J'ai essayé :

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

si le cadre de données original est appelé "expr", mais il donne les résultats dans un format incorrect, comme vous pouvez le voir.

264voto

learnr Points 1585

Pour sélectionner les lignes en fonction de un 'cell_type' (par exemple 'hesc'), utilisez == :

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

Pour sélectionner des lignes en fonction de deux ou plusieurs "cell_type" différents (par exemple, "hesc"). o 'bj fibroblast'), utiliser %in% :

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

97voto

rcs Points 22112

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

38voto

Ken Williams Points 4686

La raison expr[expr[2] == 'hesc'] ne fonctionne pas dans le cas d'une base de données, x[y] sélectionne les colonnes, pas les lignes. Si vous souhaitez sélectionner des lignes, utilisez la syntaxe suivante x[y,] au lieu de cela :

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

30voto

Natty_E Points 44

Vous pouvez utiliser le dplyr l'emballage :

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

9voto

eigenfoo Points 157

Personne ne semble avoir inclus la fonction "which". Elle peut également s'avérer utile pour le filtrage.

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

Cela permet également de traiter les NA et de les supprimer de la base de données résultante.

En exécutant cette méthode 50000 fois sur un cadre de données de 9840 par 24, il semble que la méthode which soit 60% plus rapide que la méthode %in%.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X