¿Cómo identificar y recuperar múltiples patrones de múltiples textos? [duplicar]
Espero que esto no se marque como duplicado. He visto publicaciones similares de stackoverflow pero no puedo hacer que funcione para mí.
Mi objetivo: 1º: Quiero detectar en main_df, si la variable 'Code' en auxiliar_df está ahí. 2º: Después de haber detectado quiero crear una columna, con los códigos identificados. Por ejemplo, para el texto 'Rendimiento escolar, quiero tener una línea como' A1, A6, A7 '.
main_df <- read.table(header = TRUE,
stringsAsFactors = FALSE,
text="Title Text
'School Performance' 'Students A1, A6 and A7 are great'
'Groceries Performance' 'Students A9, A3 are ok'
'Fruit Performance' 'A5 and A7 will be great fruit pickers'
'Jedi Performance' 'A3, A6, A5 will be great Jedis'
'Sith Performance' 'No one is very good. We should be happy.'")
auxiliary_df <- read.table(header = TRUE,
stringsAsFactors = FALSE,
text="FirstName Code
'Alex' 'A1'
'Figo' 'A6'
'Rui' 'A7'
'Deco' 'A5'
'Cristiano' 'A9'
'Ronaldo' 'A3'")
Lo que probé:
toMatch <- auxiliary_df$Code matches <- grep(paste(toMatch, collapse = "|"), main_df$Title, value=TRUE)
matches #returns character(0)
No logré identificar ninguno de los códigos y moverlos a la nueva variable.
La salida deseada se vería así:
'Rendimiento escolar' 'Los estudiantes A1, A6 y A7 son excelentes' 'A1, A6, A7'
¡Cualquier ayuda es bienvenida!
Respuestas
Podemos usar colapsar todo Codeen un patrón y usarlo str_extract_allpara extraer todos los códigos que aparecen Texty combinarlos en una cadena separada por comas.
main_df$extract_string <- sapply(stringr::str_extract_all(main_df$Text,
paste0('\\b', auxiliary_df$Code, '\\b', collapse = '|')), toString)
main_df
# Title Text extract_string
#1 School Performance Students A1, A6 and A7 are great A1, A6, A7
#2 Groceries Performance Students A9, A3 are ok A9, A3
#3 Fruit Performance A5 and A7 will be great fruit pickers A5, A7
#4 Jedi Performance A3, A6, A5 will be great Jedis A3, A6, A5
#5 Sith Performance No one is very good. We should be happy.
Se agregaron límites de palabras ( \\b) en el patrón para que A1no coincidan A11o A110si no están presentes en el Text.
Intentas coincidir con en main_df$Titlelugar de main_df$Text. Puedes usar gregexprwith regmatchespara extraer los hits (usando principalmente tu código).
regmatches(main_df$Text, gregexpr(paste(auxiliary_df$Code, collapse = "|"),
main_df$Text))
#[[1]]
#[1] "A1" "A6" "A7"
#
#[[2]]
#[1] "A9" "A3"
#
#[[3]]
#[1] "A5" "A7"
#
#[[4]]
#[1] "A3" "A6" "A5"
#
#[[5]]
#character(0)
#