中删除条目
问题描述:
我有两个特征向量:中删除条目
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个条目。
答
我们可以用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)]
答
的@Ronak给出的答案看起来比我的更好,但一种选择是使用sapply
和grepl
来获得匹配的匹配矩阵,对于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
答
这也应该工作:
y[Reduce("+", lapply(x, grepl, y, fixed=TRUE))==0]
# [1] "kot" "kk" "y"
很好的选择。加一。如果要比较的向量元素的数量很大,并且grep不能正常工作,则此方法会好得多 – akrun
我同意akrun。这是非常有用的,但在这种情况下,我更喜欢grep解决方案,因为我的载体不会那么长。 – Lecromine