Estoy tratando de usar grep
para probar si un vector de cadenas está presente en otro vector o no, y generar los valores que están presentes (los patrones coincidentes).
Tengo un marco de datos como este:
FirstName Letter
Alex A1
Alex A6
Alex A7
Bob A1
Chris A9
Chris A6
Tengo un vector de patrones de secuencias que se encuentran en las columnas "letra", por ejemplo: c("A1", "A9", "A6")
.
Me gustaría comprobar si alguna de las cadenas en el vector de patrón está presente en la columna "Letra". Si lo son, me gustaría la salida de valores únicos.
El problema es que no sé cómo usarlo grep
con múltiples patrones. Lo intenté:
matches <- unique (
grep("A1| A9 | A6", myfile$Letter, value=TRUE, fixed=TRUE)
)
Pero me da 0 coincidencias, lo cual no es cierto, ¿alguna sugerencia?
fixed=TRUE
porque su patrón es una verdadera expresión regular.match
o%in%
incluso==
es la única forma correcta de comparar coincidencias exactas. regex es muy peligroso para tal tarea y puede conducir a resultados inesperados.Respuestas:
Además del comentario de @ Marek sobre no incluir
fixed==TRUE
, también debe no tener los espacios en su expresión regular. Debería ser"A1|A9|A6"
.También mencionas que hay muchos patrones. Asumiendo que están en un vector
Luego puede crear su expresión regular directamente usando
paste
ycollapse = "|"
.fuente
toMatch %in% myfile$Letter
?Buenas respuestas, sin embargo, no te olvides
filter()
de dplyr:fuente
grepl
funciona con un patrón en ese momento (necesitamos un vector con longitud 1), tenemos 3 patrones (vector de longitud 3), por lo que podemos combinarlos con uno usando algunos amigables para el separador grepl|
, pruebe su suerte con otros :))|(
a los patrones separados podría hacer esto más robusta:paste0("(", paste(patterns, collapse=")|("),")")
. Desafortunadamente, también se vuelve un poco menos elegante. Esto da como resultado un patrón(A1)|(A9)|(A6)
.Esto debería funcionar:
O incluso más simplemente:
fuente
%like%
no está en la base R, por lo que debe mencionar qué paquete (s) se necesitan para usarlo.%like%
es parte deldata.table
paquete. También en similaresdata.table
sonlike(...)
,%ilike%
y%flike%
.Según la publicación de Brian Digg, aquí hay dos funciones útiles para filtrar listas:
fuente
¿Has probado las funciones
match()
ocharmatch()
?Ejemplo de uso:
fuente
match
es que no está usando patrones, está esperando una coincidencia exacta.No estoy seguro de si esta respuesta ya apareció ...
Para el patrón particular en la pregunta, puede hacerlo con una sola
grep()
llamada,fuente
Para agregar a Brian Diggs, responda.
Otra forma de utilizar grepl devolverá un marco de datos que contiene todos sus valores.
Tal vez un poco más limpio ... tal vez?
fuente
Quita los espacios. Entonces hazlo:
fuente
Utilizando la
sapply
fuente
Sugiero escribir un pequeño guión y hacer múltiples búsquedas con Grep. Nunca he encontrado una manera de buscar múltiples patrones, y créeme, ¡he buscado!
Así, su archivo de shell, con una cadena incrustada:
Luego ejecute escribiendo myshell.sh.
Si desea poder pasar la cadena en la línea de comando, hágalo así, con un argumento de shell: esta es la notación bash por cierto:
Etcétera.
Si hay muchos patrones para hacer coincidir, puedes ponerlo en un bucle for.
fuente