Tenho os seguintes dados.
stringstosearch <- c("to", "and", "at", "from", "is", "of")
set.seed(199)
datatxt <- data.frame(id = c(rnorm(5)),
x = c("Contrary to popular belief, Lorem Ipsum is not simply random text.",
"A Latin professor at Hampden-Sydney College in Virginia",
"It has roots in a piece of classical Latin ",
"literature from 45 BC, making it over 2000 years old.",
"The standard chunk of Lorem Ipsum used since"))
Quero pesquisar as palavras-chave listadas stringtosearch
e criar colunas para cada uma com resultados.
tentei
library(stringr)
datatxt$result <- str_detect(datatxt$x, paste0(stringstosearch, collapse = '|'))
que retorna
> datatxt$result
[1] TRUE TRUE TRUE TRUE TRUE
No entanto, estou procurando uma abordagem que crie um vetor booleano para cada palavra em stringstosearch
, ou seja
id x to and at from is of
1 -1.9091427 Contrary to popular belief, Lorem Ipsum is not simply random text. TRUE FALSE FALSE FALSE TRUE TRUE
2 0.5551667 A Latin professor at Hampden-Sydney College in Virginia FALSE FALSE TRUE FALSE FALSE FALSE
3 -2.2163365 It has roots in a piece of classical Latin FALSE FALSE FALSE FALSE FALSE FALSE
4 0.4941455 literature from 45 BC, making it over 2000 years old. FALSE FALSE FALSE TRUE FALSE FALSE
5 -0.5805710 The standard chunk of Lorem Ipsum used since FALSE FALSE FALSE FALSE FALSE FALSE
Alguma ideia de como conseguir isso?
Aqui está uma linha base R. Use
sprintf()
para adicionar as\\b
âncoras de limite de palavra a cada padrão. Isso significa que, por exemplo,"and"
não corresponderá"random"
a . Então itere sobre esses padrões comlapply()
, usandogrepl()
para corresponder cada padrão adatatxt$x
. Isso retorna uma lista de vetores lógicos, que podemos atribuir de volta ao quadro de dados.Agora
datatxt
é como desejado:tidyverse
abordagemComo você marcou
tidyverse
, aqui está um método alternativo. Isso retorna a mesma lista que a abordagem base do R usandotidyverse
funções, exceto que é nomeada. Então podemos usar o operador splice para passar issodplyr::mutate()
como novas colunas:Acho que a abordagem básica R é muito mais limpa.
Sugiro
Vectoriz[e]
usar opattern
argumento - destringfish::sf_grepl()
:dá
Observe que alterei
id
a geração paraid = 1:5
.tidyverse
Eu tenho uma solução (diferente) :Este código primeiro cria o dataframe, usando o
!!!
operador fromtidyverse
para criar uma coluna para cada elemento no vetor stringstosearch . Sem aset_names()
função, os nomes das colunas seriam citados. Então, cruzamosmutate()
todas as colunas determinadas pelos elementos de stringstosearch . Para cada coluna, determinamos withgrepl()
se o nome da coluna - recuperado dentro da chamada throughcur_column()
- existe na coluna x , com "\\b" adicionado ao regex para determinar limites de palavras e evitar falsos positivos (como SamR apontou).Agora
datatxt
produz:Criado em 2024-11-13 com reprex v2.0.2