2016-11-30 108 views
4

我有两个特征向量:中删除条目

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个条目。

回答

4

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

的@Ronak给出的答案看起来比我的更好,但一种选择是使用sapplygrepl来获得匹配的匹配矩阵,对于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 
+1

很好的选择。加一。如果要比较的向量元素的数量很大,并且grep不能正常工作,则此方法会好得多 – akrun

+0

我同意akrun。这是非常有用的,但在这种情况下,我更喜欢grep解决方案,因为我的载体不会那么长。 – Lecromine

0

这也应该工作:

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