Вернуть все совпадения нескольких строк в столбец с R - PullRequest
0 голосов
/ 19 декабря 2018

У меня есть фрейм данных с одним столбцом, содержащим одно или два имени.Я хочу создать второй столбец, который возвращает совпадающие имена из списка, разделенных точкой с запятой.Я пытался использовать stringr и grepl, но не могу туда добраться.

Вот пример моей таблицы и списка имен, которые я хочу извлечь.

beatles.list <- c("JOHN LENNON", "PAUL MCCARTNEY", "RINGO STARR", "GEORGE HARRISON")
people = c("JOHN W. LENNON|PAUL MCCARTNEY SIR", "RINGO STARR", "CHARLES HARRISON", "GEORGE HARRISON")
beatles.data <- data.frame(people)  

И вот как я хочу, чтобы полученная таблица выглядела.

people = c("JOHN W. LENNON|PAUL MCCARTNEY SIR", "RINGO STARR", "CHARLES HARRISON", "GEORGE HARRISON")
beatles = c("LENNON; MCCARTNEY", "STARR", "", "HARRISON")
beatles.data <- data.frame(people, beatles) 

Спасибо за помощь!

1 Ответ

0 голосов
/ 19 декабря 2018

Я бы предложил использовать Tidyverse.Обратите внимание, что ваш beatles.list не поможет сопоставить с people для получения желаемого результата.В моем примере я изменил его с помощью lookbehind, я также добавил пробел после точки с запятой в функции paste, так как это то, что вы положили в своем примере.

См. https://stackoverflow.com/a/43146829/6086135, длязачем нужен compact.

library(tidyverse)
beatles.list <- c("(?<=JOHN (W. ){0,1})LENNON", "(?<=PAUL )MCCARTNEY", "(?<=RINGO )STARR", "(?<=GEORGE )HARRISON")
  people = c("JOHN W. LENNON|PAUL MCCARTNEY SIR", "RINGO STARR", "CHARLES HARRISON", "GEORGE HARRISON")
  beatles.data <- data.frame(people)  

  beatles.data %>% 
    rowwise() %>% #needed here when supplying a vector to str_extract
    mutate(
      beatles = people %>% 
        str_extract_all(beatles.list) %>% 
        compact() %>% #removes the empty elements from the list
        paste(collapse = "; ") # to provide the desired output
    )
...