Me gustaría devolver un vector lógico con valores VERDADEROS para todos los elementos en los que se detecta cualquier elemento de otro vector de caracteres.

Datos de ejemplo:

lorem <- c("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.",
            "Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.",
            "Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.",
            "Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.")

Como ejemplo, me gustaría buscar los elementos 'sit' y 'non'.

Lo intenté

str_detect(lorem, c('sit', 'non'))

Y

str_detect(lorem, c('non', 'sit'))

Lo que me mostró que el segundo argumento probablemente se está reciclando, por lo que la llamada str_detect (lorem, c ('sit', 'non')) en realidad ocurre de la siguiente manera:

c(str_detect(lorem[1], 'sit), str_detect(lorem[2], 'non'), str_detect(lorem[3], 'sit'), str_detect(lorem[4], 'non'))

Finalmente se me ocurrió la siguiente solución:

multi_string_detect<-function(x,y){
        temp<-sapply(y, function(z){str_detect(x, z)})
        apply(temp, 1, any)
}

multi_string_detect(lorem, c('sit', 'non')
[1]  TRUE FALSE FALSE  TRUE

¿Existe una alternativa limpia / más simple a mi función multi_string_detect?

2
GuedesBF 22 ene. 2021 a las 02:29

1 respuesta

La mejor respuesta

Otra opción es contraer pattern en una sola cadena con |

library(stringr)
str_detect(lorem, str_c(c('non', 'sit'), collapse = "|"))
#[1]  TRUE FALSE FALSE  TRUE
1
akrun 21 ene. 2021 a las 23:30