繁体   English   中英

与 r 中的 dataframe 列的精确匹配文本

[英]Exact Matching text with dataframe column in r

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

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

我在 R 中有以下 dataframe:

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"))

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

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 = ","))

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

如果您在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

我们可以使用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")

将第一个*apply function 更改为两行 function。 如果正则表达式变为"\\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 ,我将使用 function is.na<-

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")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM