[英]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.