【问题标题】:Return all matches of multiple strings to column with R将多个字符串的所有匹配项返回到 R 列
【发布时间】:2019-05-20 09:00:29
【问题描述】:

我有一个包含一列或两个名称的数据框。我想创建第二列,它从列表中返回匹配的名称,用分号分隔。我已经尝试过使用 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) 

感谢您的帮助!

【问题讨论】:

    标签: r string-matching


    【解决方案1】:

    我建议使用 tidyverse。请注意,您的 beatles.list 将无法与 people 匹配以提供所需的输出。在我的示例中,我对其进行了后向修改,还在 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
        )
    

    【讨论】:

    • 除了删除名字之外,您现在与不需要的行匹配,Charles Harrison
    • 是的,我有点太快了。现在修复了答案:)(不是披头士乐队的粉丝)
    • sapply(str_extract_all(beatles.data$people,paste0(sub('\\s','.*',beatles.list),collapse = '|')),function(x)paste(str_extract(x,'\\S+$'),collapse=';'))
    猜你喜欢
    • 1970-01-01
    • 2020-03-28
    • 2017-08-02
    • 1970-01-01
    • 2018-07-14
    • 2020-08-07
    • 1970-01-01
    • 2020-05-31
    • 1970-01-01
    相关资源
    最近更新 更多