web-dev-qa-db-fra.com

Sélection de lignes dans lesquelles une colonne contient une chaîne telle que 'hsa ..' (correspondance de chaîne partielle)

J'ai un fichier texte de 371MB contenant des données micro-ARN. Essentiellement, je voudrais sélectionner uniquement les lignes contenant des informations sur les microARN humains.

J'ai lu dans le fichier en utilisant un read.table. Habituellement, j'accomplirais ce que je voulais avec sqldf - s'il avait une syntaxe 'like' (sélectionnez * à partir de <> où miARN ressemble à 'hsa'). Malheureusement, sqldf ne supporte pas cette syntaxe.

Comment puis-je faire cela dans R? J'ai regardé autour de stackoverflow et ne vois pas un exemple de comment je peux faire une correspondance de chaîne partielle. J'ai même installé le paquet stringr - mais il n'a pas tout à fait ce dont j'ai besoin.

Ce que je voudrais faire, c'est quelque chose comme ceci - où toutes les lignes où hsa - * sont sélectionnées.

selectedRows <- conservedData[, conservedData$miRNA %like% "hsa-"]

ce qui bien sûr, n'est pas une syntaxe correcte.

Quelqu'un peut-il m'aider s'il vous plaît avec cela? Merci beaucoup pour la lecture.

Asda

79
Asda

Je remarque que vous mentionnez une fonction %like% dans votre approche actuelle. Je ne sais pas si c'est une référence au %like% de "data.table", mais si c'est le cas, vous pouvez certainement l'utiliser comme suit.

Notez que l'objet ne doit pas nécessairement être un data.table (mais rappelez-vous également que les approches de sous-ensembles pour data.frames et data.tables ne sont pas identiques):

library(data.table)
mtcars[rownames(mtcars) %like% "Merc", ]
iris[iris$Species %like% "osa", ]

Si c'est ce que vous aviez, alors vous veniez peut-être de mélanger les positions de lignes et de colonnes pour les données de sous-ensemble.


Si vous ne souhaitez pas charger de paquet, vous pouvez utiliser grep() pour rechercher la chaîne que vous recherchez. Voici un exemple avec l'ensemble de données mtcars, où nous correspondons à toutes les lignes dont le nom inclut "Merc":

mtcars[grep("Merc", rownames(mtcars)), ]
             mpg cyl  disp  hp drat   wt qsec vs am gear carb
# Merc 240D   24.4   4 146.7  62 3.69 3.19 20.0  1  0    4    2
# Merc 230    22.8   4 140.8  95 3.92 3.15 22.9  1  0    4    2
# Merc 280    19.2   6 167.6 123 3.92 3.44 18.3  1  0    4    4
# Merc 280C   17.8   6 167.6 123 3.92 3.44 18.9  1  0    4    4
# Merc 450SE  16.4   8 275.8 180 3.07 4.07 17.4  0  0    3    3
# Merc 450SL  17.3   8 275.8 180 3.07 3.73 17.6  0  0    3    3
# Merc 450SLC 15.2   8 275.8 180 3.07 3.78 18.0  0  0    3    3

Et, un autre exemple, en utilisant le jeu de données iris à la recherche de la chaîne osa:

irisSubset <- iris[grep("osa", iris$Species), ]
head(irisSubset)
#   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
# 1          5.1         3.5          1.4         0.2  setosa
# 2          4.9         3.0          1.4         0.2  setosa
# 3          4.7         3.2          1.3         0.2  setosa
# 4          4.6         3.1          1.5         0.2  setosa
# 5          5.0         3.6          1.4         0.2  setosa
# 6          5.4         3.9          1.7         0.4  setosa

Pour votre problème, essayez:

selectedRows <- conservedData[grep("hsa-", conservedData$miRNA), ]
126

Essayez str_detect() à partir du package stringr , qui détecte la présence ou l'absence d'un motif dans une chaîne.

Voici une approche qui intègre également le tube %>% et le filter() du package dplyr :

library(stringr)
library(dplyr)

CO2 %>%
  filter(str_detect(Treatment, "non"))

   Plant        Type  Treatment conc uptake
1    Qn1      Quebec nonchilled   95   16.0
2    Qn1      Quebec nonchilled  175   30.4
3    Qn1      Quebec nonchilled  250   34.8
4    Qn1      Quebec nonchilled  350   37.2
5    Qn1      Quebec nonchilled  500   35.3
...

Ceci filtre l'échantillon de données CO2 (fourni avec R) pour les lignes dans lesquelles la variable Traitement contient la sous-chaîne "non". Vous pouvez choisir si str_detect trouve des correspondances fixes ou utilise une expression régulière - voir la documentation du paquet stringr.

50
Sam Firke

LIKE devrait fonctionner en sqlite:

require(sqldf)
df <- data.frame(name = c('bob','robert','peter'),id=c(1,2,3))
sqldf("select * from df where name LIKE '%er%'")
    name id
1 robert  2
2  peter  3
19
user1609452