web-dev-qa-db-fra.com

Filtrer les lignes de data.frame par une condition logique

Je souhaite filtrer les lignes d'un data.frame en fonction d'une condition logique. Supposons que j'ai 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 a le même aspect mais ne contient que les données d'un seul type de cellule. Par exemple. sous-ensemble/sélection des lignes contenant le type de cellule "hesc":

   expr_value     cell_type
1    5.929771          hesc
2    5.873096          hesc
3    5.665857          hesc

Ou soit le type de cellule "fibroblaste bj" 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

Y at-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 s'appelle "expr", mais donne les résultats dans un format incorrect, comme vous pouvez le voir.

125
lhahne

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

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

Pour sélectionner des lignes en fonction d'au moins deux 'types_cellule' (par exemple, 'hesc' ou 'bj fibroblast'), utilisez %in%:

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

Utilisez 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"))
76
rcs

La raison pour laquelle expr[expr[2] == 'hesc'] ne fonctionne pas est que, pour un cadre de données, x[y] sélectionne des colonnes et non des lignes. Si vous souhaitez sélectionner des lignes, utilisez plutôt la syntaxe x[y,]:

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

Vous pouvez utiliser le package dplyr:

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

Je travaillais sur une base de données et n'ayant pas de chance avec les réponses fournies, elle retournait toujours 0 lignes, donc j'ai trouvé et utilisé grepl:

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

Ce qui a essentiellement coupé mon cadre de données aux seules lignes qui contenaient "liaison descendante" dans la colonne Direction de transmission. P.S. Si quelqu'un peut deviner pourquoi je ne vois pas le comportement attendu, veuillez laisser un commentaire.

Plus précisément à la question initiale:

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

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

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

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

columnNameToFilter = "cell_type"
expr[expr[[columnNameToFilter]] == "hesc", ]
2
Daniel Bonetti

Personne ne semble avoir inclus la fonction qui. Cela peut aussi s'avérer utile pour le filtrage. 

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

Cela traitera également les NA et les supprimera de la trame de données résultante.

Si vous exécutez cette opération sur un bâti de données 9840 x 24 50000 fois, il semble que la méthode dont le temps d'exécution est 60% plus rapide que la méthode% en%. 

1
eigenfoo

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 en utilisant l'opérateur %like% pour la correspondance des modèles

 expr[cell_type %like% "hesc"|cell_type %like% "fibroblast"]
0
Varn K