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
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.frame
s et data.table
s 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), ]
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.
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