Как найти список строк и удалить все лишние символы на основе списка имен? - PullRequest
1 голос
/ 20 октября 2019

У меня есть фрейм данных со списком заголовков и другой информацией, а также соответствующим списком имен. То, что я хотел бы сделать, это извлечь имена из названий и добавить их в новую колонку («Игроки» в конце). Я исчерпал свои предположительно небольшие знания R и не могу найти способ заставить это работать ссоответствующий список имен.

names <- c("Mookie Betts", "Cody Bellinger", "Mike Trout", "Ronald Acuna")

titles <- c("asdfasdf Mike Trout asdfasd", "jashfjasf Mookie Betts hasjdfhasj", "asdfuiojhuo Ronald Acuna ashdfj", "uiwqtruhjhb Cody Bellinger asdfasdf", "asdhfjaf Ronald Acuna ahsdfj", "hajsdf Mookie Betts ahsdfj")

Я не могу понять, как извлечь только имена. Всякий раз, когда я думаю, что это решено, он возвращает всю строку заголовка.

Ответы [ 2 ]

2 голосов
/ 20 октября 2019

Вы можете создать выражение регулярного выражения из вашего names следующим образом:

patterns <- paste0(names, collapse = "|")

и использовать пакет stringr для извлечения этих имен из titles (игнорируя регистр, как было запрошено в комментарии):

library(stringr)

str_match(titles, regex(patterns, ignore_case = TRUE))
#      [,1]            
# [1,] "Mike Trout"    
# [2,] "Mookie Betts"  
# [3,] "Ronald Acuna"  
# [4,] "Cody Bellinger"
# [5,] "Ronald Acuna"  
# [6,] "Mookie Betts" 
1 голос
/ 20 октября 2019

Эти однострочники не используют никаких пакетов или регулярных выражений, кроме фиксированных строк.

1) Мы подбираем имена в заголовках и затем переупорядочиваем в исходном порядке:

with(stack(sapply(names, grep, titles, fixed = TRUE)), ind[order(values)])
## [1] Mike Trout     Mookie Betts   Ronald Acuna   Cody Bellinger Ronald Acuna  
## [6] Mookie Betts  
## Levels: Mookie Betts Cody Bellinger Mike Trout Ronald Acuna

2) Создает матрицу, строки которой соответствуют именам, а столбцы соответствуют заголовкам. Позиция единственной ИСТИНЫ в каждом столбце является индексом имени, соответствующего этому названию.

names[colSums(outer(names, titles, Vectorize(grepl)) * seq_along(names))]
## [1] "Mike Trout"     "Mookie Betts"   "Ronald Acuna"   "Cody Bellinger"
## [5] "Ronald Acuna"   "Mookie Betts"  

3) В примере в вопросе всегда есть 4 слова в каждомназвание и средние 2 слова - это имя. Если бы это всегда было так, то мы могли бы извлечь имена, даже не используя вектор names:

with(read.table(text = titles, as.is = TRUE)[2:3], paste(V2, V3))
## [1] "Mike Trout"     "Mookie Betts"   "Ronald Acuna"   "Cody Bellinger"
## [5] "Ronald Acuna"   "Mookie Betts"  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...