【问题标题】:Exact Matching text with dataframe column in r精确匹配文本与 r 中的数据框列
【发布时间】:2020-04-11 16:51:31
【问题描述】:

我在 R 中有一个单词向量:

words = c("Awesome","Loss","Good","Bad")

我在 R 中有以下数据框:

df <- data.frame(ID = c(1,2,3),
                 Response = c("Today is an awesome day", 
                              "Yesterday was a bad day,but today it is good",
                              "I have losses today"))

我想要做的是在响应列中完全匹配的单词应该被提取并插入到数据框中的新列中。最终输出应该是这样的

ID           Response                        Match          
1            Today is an awesome day        Awesome           
2            Yesterday was a bad day        Bad,Good           
             ,but today it is good      
3            I have losses today            NA

我使用了以下代码:

提取匹配词列表

x <- sapply(words, function(x) grepl(tolower(x), tolower(df$Response)))

将匹配的单词粘贴在一起

df$Words <- apply(x, 1, function(i) paste0(names(i)[i], collapse = ","))

但它提供了匹配,但不是精确的。请帮忙。

【问题讨论】:

    标签: r exact-match


    【解决方案1】:

    如果您在words 向量中使用锚点,您将确保完全匹配:^ 断言您在开头,$ 断言您在单词结尾。所以:

    words = c("Awesome","^Loss$","Good","Bad")
    

    然后使用您的代码:

    x <- sapply(words, function(x) grepl(tolower(x), tolower(df$Response)))
    df$Words <- apply(x, 1, function(i) paste0(names(i)[i], collapse = ","))
    

    给出:

    > df
      ID                                     Response    Words
    1  1                      Today is an awesome day  Awesome
    2  2 Yesterday was a bad day,but today it is good Good,Bad
    3  3                          I have losses today  
    

    将空白变为NA

    df$Words[df$Words == ""] <- NA
    

    【讨论】:

      【解决方案2】:

      我们可以使用str_extract_all

      library(stringr)
      library(dplyr)
      library(purrr)
      df %>%
          mutate(Words = map_chr(str_extract_all(Response, str_c("
             (?i)\\b(", str_c(words, collapse="|"), ")\\b")), toString))
      #   ID                                     Response     Words
      #1  1                      Today is an awesome day   awesome
      #2  2 Yesterday was a bad day,but today it is good bad, good
      #3  3                          I have losses today          
      

      数据

      words <- c("Awesome","Loss","Good","Bad")
      

      【讨论】:

        【解决方案3】:

        将第一个 *apply 函数更改为两行函数。如果正则表达式变为"\\bword\\b",那么它会捕获被边界包围的单词。

        x <- sapply(words, function(x) {
          y <- paste0("\\b", x, "\\b")
          grepl(tolower(y), tolower(df$Response))
        })
        

        现在运行问题中发布的第二个apply

        df$Words <- apply(x, 1, function(i) paste0(names(i)[i], collapse = ","))
        
        df
        #  ID                                     Response    Words
        #1  1                      Today is an awesome day  Awesome
        #2  2 Yesterday was a bad day,but today it is good Good,Bad
        #3  3                          I have losses today       
        

        至于NA,我将使用函数is.na&lt;-

        is.na(df$Words) <- df$Words == ""
        

        数据。

        df <- read.table(text = "
        ID           Response
        1            'Today is an awesome day'
        2            'Yesterday was a bad day,but today it is good'
        3            'I have losses today'
        ", header = TRUE)
        
        words <- c("Awesome","Loss","Good","Bad")
        

        【讨论】:

          猜你喜欢
          • 2018-08-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-03-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多