【发布时间】:2016-10-17 17:19:07
【问题描述】:
我一直在数据框中的两个向量之间匹配文本字符串。几个值正好有三个字符,并且作为另一个字符串中另一个单词的一部分匹配。我想为此找到正则表达式。这是一个例子:
a <- c("urban", "crabtree", "rba", "rba hks","barbara", "lederbach")
b <- c("rba", "rba", "rba", "rba", "rba", "rba")
df <- data.frame(a, b)
我想用空格(即“”)替换那些“rba”仅作为单词一部分出现的值。所需的输出是:
b <- c("", "", "rba", "rba", "", "")
所以它有点像:
grep("\\b...\\b", df$a, value = TRUE)
但我想修改 b 列并在不匹配的地方插入“”。
我知道 %in% 可用于精确匹配,但我希望使用 gsub 来做一些事情:
funb <- function(x) gsub("\\b...\\b", "", x)
df$b <- lapply(df$b, funb)
但我运气不佳。显然有些不对劲,有人可以帮我得到想要的结果吗?任何意见或建议将不胜感激。谢谢。
【问题讨论】:
-
b列的用途是什么?像a[!grepl("\\brba\\b", a)] <- ""这样的东西不行吗? -
@DavidArenburg b 列是匹配列。因此,从更大的数据框中,“rba”是与 a 列中的字符串最匹配的字符串。所以我想保留b列,但我想让它看起来像上面的“最终”向量。
-
这行得通
library(stringi) ; a[!stri_detect_regex(a, paste0("\\b", b, "\\b"))] <- ""吗? -
就像我说的,它很笼统。它使用两列,它允许灵活的正则表达式。除此之外,我无法再猜测了。也许其他人可以