R grep: ¿hay un operador AND?

Supongamos que tengo el siguiente dataframe:

User.Id Tags 34234 imageUploaded,people.jpg,more,comma,separated,stuff 34234 imageUploaded 12345 people.jpg 

¿Cómo podría usar grep (o alguna otra herramienta) solo para tomar las filas que incluyen “imageUploaded” y “people”? En otras palabras, ¿cómo podría crear un subconjunto que incluya solo las filas con las cadenas “imageUploaded” Y “people.jpg”, independientemente del orden?

Yo he tratado:

 data.people<-data[grep("imageUploaded|people.jpg",results$Tags),] data.people<-data[grep("imageUploaded?=people.jpg",results$Tags),] 

¿Hay un operador AND? ¿O tal vez otra forma de obtener el resultado deseado?

Gracias a esta respuesta , esta expresión regular parece funcionar. Desea usar grepl() que devuelve un elemento lógico para indexar en su objeto de datos. No pretenderé comprender completamente el funcionamiento interno de la expresión regular, pero independientemente:

 x < - c("imageUploaded,people.jpg,more,comma,separated,stuff", "imageUploaded", "people.jpg") grepl("(?=.*imageUploaded)(?=.*people\\.jpg)", x, perl = TRUE) #----- [1] TRUE FALSE FALSE 

Me encanta la respuesta de @ Chase, y tiene sentido para mí, pero puede ser un poco peligroso usar constructos que uno no comprende del todo.

Esta respuesta pretende tranquilizar a cualquiera que desee utilizar el enfoque más directo de @ thelatemail, ya que funciona igual de bien y es completamente competitivo en cuanto a la velocidad. Ciertamente es lo que usaría en este caso. (También es tranquilizador que la más sofisticada Perl-compatible-regex no paga ningún costo de rendimiento por su potencia y su fácil extensión).

 library(rbenchmark) x < - paste0(sample(letters, 1e6, replace=T), ## A longer vector of sample(letters, 1e6, replace=T)) ## possible matches ## Both methods give identical results tlm <- grepl("a", x, fixed=TRUE) & grepl("b", x, fixed=TRUE) pat <- "(?=.*a)(?=.*b)" Chase <- grepl(pat, x, perl=TRUE) identical(tlm, Chase) # [1] TRUE ## Both methods are similarly fast benchmark( tlm = grepl("a", x, fixed=TRUE) & grepl("b", x, fixed=TRUE), Chase = grepl(pat, x, perl=TRUE)) # test replications elapsed relative user.self sys.self # 2 Chase 100 9.89 1.105 9.80 0.10 # 1 thelatemail 100 8.95 1.000 8.47 0.48 

Por motivos de legibilidad, podrías hacer:

 x < - c( "imageUploaded,people.jpg,more,comma,separated,stuff", "imageUploaded", "people.jpg" ) xmatches <- intersect( grep("imageUploaded",x,fixed=TRUE), grep("people.jpg",x,fixed=TRUE) ) x[xmatches] [1] "imageUploaded,people.jpg,more,comma,separated,stuff" 

A continuación se muestra una alternativa a grep usando stringr::str_detect() . Esto evita el uso de perl=true @ jan-stanstrup. Además, el dplyr::filter() devolverá las filas dentro del dataframe en sí mismo para que nunca tenga que abandonar el df.

 library(stringr) libary(dplyr) x < - data.frame(User.Id =c(34234,34234,12345), Tags=c("imageUploaded,people.jpg,more,comma,separated,stuff", "imageUploaded", "people.jpg")) data.people <- x %>% filter(str_detect(Tags,"(?=.*imageUploaded)(?=.*people\\.jpg)")) data.people # returns # User.Id Tags # 1 34234 imageUploaded,people.jpg,more,comma,separated,stuff 

Esto es más simple y funciona si “people.jpg” siempre sigue a “imageUploaded”

 str_extract(x,"imageUploaded.*people\\.jpg")