2012-03-01 13 views
21

que estoy tratando de seleccionar filas de una trama de datos en la cadena de contenidos en una columna coincide con cualquiera de una expresión regular o una subcadena:El uso de expresiones regulares para seleccionar filas en I trama de datos

trama de datos:

aName bName pName call alleles logRatio strength 
AX-11086564 F08_ADN103 2011-02-10_R10 AB CG 0.363371 10.184215 
AX-11086564 A01_CD1919 2011-02-24_R11 BB GG -1.352707 9.54909 
AX-11086564 B05_CD2920 2011-01-27_R6 AB CG -0.183802 9.766334 
AX-11086564 D04_CD5950 2011-02-09_R9 AB CG 0.162586 10.165051 
AX-11086564 D07_CD6025 2011-02-10_R10 AB CG -0.397097 9.940238 
AX-11086564 B05_CD3630 2011-02-02_R7 AA CC 2.349906 9.153076 
AX-11086564 D04_ADN103 2011-02-10_R2 BB GG -1.898088 9.872966 
AX-11086564 A01_CD2588 2011-01-27_R5 BB GG -1.208094 9.239801 

Por ejemplo, quiero un marco de datos que contenga solo filas que contengan ADN en la columna bName. En segundo lugar, quisiera todas las filas que contienen ADN en la columna bName y que coinciden con 2011-02-10_R2 en la columna pName.

He intentado utilizar las funciones grep(), agrep() y más, pero sin éxito ...

Respuesta

25
subset(dat, grepl("ADN", bName) & pName == "2011-02-10_R2") 

Note "&" (y no "& &" que no se vectorizado) y que "==" (y no "=", que es la asignación).

Tenga en cuenta que podría haber utilizado:

dat[ with(dat, grepl("ADN", bName) & pName == "2011-02-10_R2") , ] 

... y que podría ser preferible cuando se utiliza dentro de funciones, sin embargo, que devolverá los valores de NA de las líneas en las que dat $ pName es Na. Ese defecto (que algunos consideran una característica) podría eliminarse mediante la adición de & !is.na(dat$pName) a la expresión lógica.

-2

¿Por qué no:

grep 'ADN'|grep '2011-02-10_R2' 

También puede hacer esto:

grep -P '\t.{4}(ADN).*(2011-02-10_R2).*' 
+8

Debido a que el lenguaje es [tag: R] – Andrie

+1

Lo sentimos, no se dio cuenta de la 'r'. Supongo que simplemente podría copiar mi expresión regular entonces –

8

Aquí tiene .

Primera recrear sus datos:

dat <- read.table(text=" 
aName bName pName call alleles logRatio strength 
AX-11086564 F08_ADN103 2011-02-10_R10 AB CG 0.363371 10.184215 
AX-11086564 A01_CD1919 2011-02-24_R11 BB GG -1.352707 9.54909 
AX-11086564 B05_CD2920 2011-01-27_R6 AB CG -0.183802 9.766334 
AX-11086564 D04_CD5950 2011-02-09_R9 AB CG 0.162586 10.165051 
AX-11086564 D07_CD6025 2011-02-10_R10 AB CG -0.397097 9.940238 
AX-11086564 B05_CD3630 2011-02-02_R7 AA CC 2.349906 9.153076 
AX-11086564 D04_ADN103 2011-02-10_R2 BB GG -1.898088 9.872966 
AX-11086564 A01_CD2588 2011-01-27_R5 BB GG -1.208094 9.239801 
", header=TRUE) 

A continuación, utilice grepl para construir un índice lógico de coincidencias:

index1 <- with(dat, grepl("ADN", bName)) 
index2 <- with(dat, grepl("2011-02-10_R2", pName)) 

Ahora subconjunto usando la & operador:

dat[index1 & index2, ] 
     aName  bName   pName call alleles logRatio strength 
7 AX-11086564 D04_ADN103 2011-02-10_R2 BB  GG -1.898088 9.872966 
2

Corregido según el consejo de Andrie. Espero que esto funcione :)

df[grepl("ADN", df$bName),] 
df[grepl("ADN", df$bName) & df$pName == "2011-02-10_R2",] 
+0

Ambas declaraciones devuelven un marco de datos vacío, no las filas deseadas 1 y 7. – Andrie

+0

Sí, de hecho, tiene razón. Necesito un descanso. :) – DrDom

0

He probado usando Expresso y he usado expresiones regulares de estilo .Net; es posible que tengas que ajustar tu sabor regex. También dejé el espacio en blanco para facilitar la lectura; eliminar o usar un indicador de opción de expresión regular para ignorar.

La expresión regular básica para capturar todas las líneas es:

(?<aName> [\w-]+) \s+ (?<bName> [\w_]+) \s+ (?<pName> [\w-_]+) \s+ (?<call> \w+) \s+ (?<alleles> \w+) \s+ (?<logRatio> [\d\.-]+) \s+ (?<strength> [\d\.-]+) 

partir de esto, sólo tiene que modificar la expresión regular para el grupo de captura de llamada apropiada (s) para extraer sólo las líneas que desea.La versión modificada para capturar utilizando los criterios dados (bname contiene "ADN" y pName = "2011-02-10_R2") es:

(?<aName> [\w-]+) \s+ (?<bName> [\w_]*ADN[\w_]*) \s+ (?<pName> 2011-02-10_R2) \s+ (?<call> \w+) \s+ (?<alleles> \w+) \s+ (?<logRatio> [\d\.-]+) \s+ (?<strength> [\d\.-]+) 
0

Esta es una solución bastante escaso uso de dplyr y magrittr que creo que es lo que está buscando:

Data: 
library(magrittr) 
library(stringr) 
dat <- read.table(text=" 
aName bName pName call alleles logRatio strength 
        AX-11086564 F08_ADN103 2011-02-10_R10 AB CG 0.363371 10.184215 
        AX-11086564 A01_CD1919 2011-02-24_R11 BB GG -1.352707 9.54909 
        AX-11086564 B05_CD2920 2011-01-27_R6 AB CG -0.183802 9.766334 
        AX-11086564 D04_CD5950 2011-02-09_R9 AB CG 0.162586 10.165051 
        AX-11086564 D07_CD6025 2011-02-10_R10 AB CG -0.397097 9.940238 
        AX-11086564 B05_CD3630 2011-02-02_R7 AA CC 2.349906 9.153076 
        AX-11086564 D04_ADN103 2011-02-10_R2 BB GG -1.898088 9.872966 
        AX-11086564 A01_CD2588 2011-01-27_R5 BB GG -1.208094 9.239801 
        ", header=TRUE) 

filas que contienen ADN en la columna bname.

dat %>% 
    filter(str_detect(bName, "ADN") == TRUE) 

En segundo lugar, me gustaría que todas las filas que contienen ADN en la columna bname y ese partido 2011-02-10_R2 en pName columna.

dat %>% 
    filter(str_detect(bName, "ADN") & pName == "2011-02-10_R2") 
Cuestiones relacionadas