Seleccionar filas de marco de datos según la coincidencia parcial de cadenas en una columna

Resuelto Asda asked hace 54 años • 0 respuestas

Quiero seleccionar filas de un marco de datos en función de la coincidencia parcial de una cadena en una columna, por ejemplo, la columna 'x' contiene la cadena "hsa". Usando sqldf, si tuviera una likesintaxis, haría algo como:

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

Lamentablemente, sqldfno admite esa sintaxis.

O similarmente:

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

Lo cual por supuesto no funciona.

¿Puede alguien ayudarme con esto?

Asda avatar Jan 01 '70 08:01 Asda
Aceptado

Noto que mencionas una función %like%en tu enfoque actual. No sé si es una referencia a %like%"data.table", pero si lo es, definitivamente puedes usarlo de la siguiente manera.

Tenga en cuenta que el objeto no tiene que ser a data.table(pero también recuerde que los enfoques de subconjuntos para data.frames y data.tables no son idénticos):

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

Si eso es lo que tenía, entonces quizás simplemente había mezclado las posiciones de filas y columnas para subconjuntos de datos.


Si no desea cargar un paquete, puede intentar usar grep()para buscar la cadena que coincide. Aquí hay un ejemplo con el mtcarsconjunto de datos, donde hacemos coincidir todas las filas donde los nombres de las filas incluyen "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

Y otro ejemplo, usando el irisconjunto de datos buscando la cadena 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

Para su problema intente:

selectedRows <- conservedData[grep("hsa-", conservedData$miRNA), ]
A5C1D2H2I1M1N2O1R2T1 avatar Oct 24 '2012 06:10 A5C1D2H2I1M1N2O1R2T1

Pruebe str_detect()con el paquete stringr , que detecta la presencia o ausencia de un patrón en una cadena.

A continuación se muestra un método que también incorpora la %>%tubería y filter()el paquete 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
...

Esto filtra el conjunto de datos de CO2 de muestra (que viene con R) para filas donde la variable Tratamiento contiene la subcadena "non". Puede ajustar si str_detectbusca coincidencias fijas o utiliza una expresión regular; consulte la documentación del paquete stringr.

Sam Firke avatar Jul 07 '2015 15:07 Sam Firke

LIKEdebería funcionar 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
user1609452 avatar Oct 24 '2012 06:10 user1609452