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.
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"), ]
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"))
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
Vous pouvez utiliser le package dplyr
:
library(dplyr)
filter(expr, cell_type == "hesc")
filter(expr, cell_type == "hesc" | cell_type == "bj fibroblast")
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),]
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", ]
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%.
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"]