Question

Je veux filtrer les lignes d'un data.frame basé sur une condition logique. Supposons que je trame 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 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-ensembles / sélectionner des lignes, qui contient le type de cellule "hESC":

   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

Yat-il un moyen facile de le faire?

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.

Était-ce utile?

La solution

Pour sélectionner des lignes en fonction de une 'cell_type' (par exemple "hESC), l'utilisation ==:

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

Pour sélectionner des lignes en fonction de deux ou plusieurs 'cell_type', (par exemple, soit 'hESC' ou 'bj fibroblaste'), l'utilisation %in%:

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

Autres conseils

Utilisation subset (pour un usage interactif)

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 expr[expr[2] == 'hesc'] raison ne fonctionne pas est que pour une trame de données, x[y] sélectionne des colonnes, pas de 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

Vous pouvez utiliser le package dplyr:

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

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

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

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

Je travaillais sur un dataframe et ne pas avoir de chance avec les réponses fournies, il est toujours revenu 0 lignes, alors je l'ai trouvé et utilisé Grepl:

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

Ce qui fondamentalement coupé mon dataframe uniquement les lignes contenant « liaison descendante » dans la colonne de direction de transmission. Post-scriptum Si quelqu'un peut deviner pourquoi je ne vois pas le comportement attendu, s'il vous plaît laisser un commentaire.

Plus précisément à la question initiale:

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

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

Personne ne semble avoir inclus la fonction qui. Il peut également se révéler utile pour le filtrage.

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

traitera également NAs et de les déposer de la trame de données résultant.

L'exécution de ce sur un 9840 de 24 dataframe 50000 fois, il semble que la méthode qui a un temps courir plus vite 60% que le% de méthode%.

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 filtre à l'aide de l'opérateur pour %like% de correspondance de motif

 expr[cell_type %like% "hesc"|cell_type %like% "fibroblast"]
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top