154 votes

Sélection des lignes d'un cadre de données en fonction de la correspondance partielle d'une chaîne de caractères dans une colonne

Je veux sélectionner les lignes d'un cadre de données sur la base d'une correspondance partielle d'une chaîne dans une colonne, par exemple, la colonne 'x' contient la chaîne "hsa". En utilisant sqldf - si il avait un like syntaxe - Je ferais quelque chose comme :

select * from <> where x like 'hsa' .

Malheureusement, sqldf ne prend pas en charge cette syntaxe.

Ou de la même manière :

selectedRows <- df[ , df$x %like% "hsa-"]

Ce qui, bien sûr, ne fonctionne pas.

Quelqu'un peut-il m'aider ?

212voto

Ananda Mahto Points 67213

Je remarque que vous mentionnez une fonction %like% dans votre approche actuelle. Je ne sais pas si c'est une référence à la %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 une data.table (mais n'oubliez pas non plus que les approches de sous-ensembles pour data.frame et data.table ne sont pas identiques) :

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

Si c'est ce que vous aviez, vous avez peut-être simplement mélangé les positions des lignes et des colonnes pour le sous-ensemble des données.


Si vous ne voulez pas charger un paquet, vous pouvez essayer d'utiliser grep() pour rechercher la chaîne de caractères que vous recherchez. Voici un exemple avec l'option mtcars où nous faisons correspondre toutes les lignes où le nom de la ligne comprend "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 iris ensemble de données recherchant la chaîne de caractères 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), ]

97voto

Sam Firke Points 8843

Essayez str_detect() de la stringr qui détecte la présence ou l'absence d'un motif dans une chaîne de caractères.

Voici une approche qui intègre également le %>% tuyau et filter() de la dplyr paquet :

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
...

Cette opération filtre l'ensemble de données CO2 de l'échantillon (fourni avec R) pour les lignes où la variable Traitement contient la sous-chaîne "non". Vous pouvez ajuster si str_detect trouve des correspondances fixes ou utilise une regex - voir la documentation du paquet stringr.

23voto

user1609452 Points 4356

LIKE devrait fonctionner dans 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

7voto

AlexB Points 1952

Une autre option serait d'utiliser simplement grepl fonction :

df[grepl('er', df$name), ]
CO2[grepl('non', CO2$Treatment), ]

df <- data.frame(name = c('bob','robert','peter'),
                 id = c(1,2,3)
                 )

# name id
# 2 robert  2
# 3  peter  3

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X