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

时间:2016-11-30 10:03:20

标签: r string character gsub grepl

我有两个角色向量:

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 个答案:

答案 0 :(得分:11)

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

答案 1 :(得分:4)

@Ronak给出的答案看起来比我的更好,但一个选项是使用sapplygrepl来获取y的匹配矩阵,对于{{1}中的每个条目1}},然后通过对x的另一次调用来推动它。

apply

以下是匹配矩阵的含义:

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

答案 2 :(得分:0)

这也应该有效:

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