regex - sheet - str_detect r
R grep: ¿hay un operador AND? (4)
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 marco de datos 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")
Supongamos que tengo el siguiente marco de datos:
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"