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.

7voto

Justin Harbour Points 91

Je travaillais sur un dataframe et je n'avais pas de chance avec les réponses fournies, il retournait toujours 0 ligne, alors j'ai trouvé et utilisé grepl :

df = df[grepl("downlink",df$Transmit.direction),]

Ce qui a eu pour effet de réduire mon cadre de données aux seules lignes contenant "downlink" dans la colonne "Transmit direction". P.S. Si quelqu'un peut deviner pourquoi je ne vois pas le comportement attendu, merci de laisser un commentaire.

Pour répondre à la question initiale :

expr[grepl("hesc",expr$cell_type),]

expr[grepl("bj fibroblast|hesc",expr$cell_type),]

2voto

Daniel Bonetti Points 478

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

Dans ce cas, vous pouvez simplement faire référence au nom de la colonne que vous souhaitez filtrer :

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

1voto

DKMDebugin Points 71

Cela a fonctionné comme par magie pour moi.

celltype_hesc_bool = expr['cell_type'] == 'hesc'

expr_celltype_hesc = expr[celltype_hesc]

Consultez cet article de blog

0voto

Varn K Points 301

Nous pouvons utiliser la bibliothèque data.table

  library(data.table)
  expr <- data.table(expr)
  expr[cell_type == "hesc"]
  expr[cell_type %in% c("hesc","fibroblast")]

ou filtrer à l'aide de %like% pour la recherche de motifs

 expr[cell_type %like% "hesc"|cell_type %like% "fibroblast"]

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