在R中删除包含特定字符的字符串向量条目

13

我有两个字符向量:

x = {"a", "b", "c", "kt"}
y = {"abs", "kot", "ccf", "okt", "kk", "y"}

我需要使用x从y中删除条目,以便仅保留不包含任何x条目的字符串,就像这样:

y = {"kot", "kk", "y"}

代码应该适用于任何大小的向量x和y。

到目前为止,我尝试使用gsub和grepl,但这些只适用于单个字符串。我尝试创建循环来执行此操作,但问题似乎比我想象的更困难。当然,解决方案越复杂越好,但在这种情况下,可以假设向量x和y最多具有200个条目。

3个回答

24
我们可以使用 grep 命令来查找在 y 中与 x 模式匹配的值,并使用 !%in% 排除它们。
y[!y %in% grep(paste0(x, collapse = "|"), y, value = T)]

#[1] "kot" "kk"  "y"  

甚至更好的方法是使用grepl,因为它返回布尔向量。

y[!grepl(paste0(x, collapse = "|"), y)]

使用 invertvalue 参数的简洁版本,可以使用 grep 命令。

grep(paste0(x, collapse = "|"), y, invert = TRUE, value = TRUE)
#[1] "kot" "kk"  "y"  

4

@Ronak提供的答案看起来比我的更可取,但其中一种选择是使用sapplygrepl来获取针对y的匹配矩阵,对于x中的每个条目,然后将其与另一个apply调用组合起来。

> y[!apply(sapply(x, function(q) {grepl(q, y)}), 1, function(x) {sum(as.numeric(x)) > 0})]
[1] "kot" "kk"  "y"  

以下是我所说的匹配矩阵的含义:
> sapply(x, function(q) { grepl(q, y) })
         a     b     c    kt
[1,]  TRUE  TRUE FALSE FALSE
[2,] FALSE FALSE FALSE FALSE
[3,] FALSE FALSE  TRUE FALSE
[4,] FALSE FALSE FALSE  TRUE
[5,] FALSE FALSE FALSE FALSE
[6,] FALSE FALSE FALSE FALSE
       ^^^^ each column is a match result for each element of x

我同意akrun的观点。这很有帮助,但在这种情况下,我更喜欢grepl解决方案,因为我的向量不是那么长。 - Lecromine

0

这也应该能够工作:

y[Reduce("+", lapply(x, grepl, y, fixed=TRUE))==0]
# [1] "kot" "kk"  "y"  

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接