Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从包含R中特定字符的字符串向量中删除条目_R_String_Character_Gsub_Grepl - Fatal编程技术网

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

从包含R中特定字符的字符串向量中删除条目,r,string,character,gsub,grepl,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 = {"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
中的模式匹配,并使用
!%在%

y[!y %in% grep(paste0(x, collapse = "|"), y, value = T)]

#[1] "kot" "kk"  "y"  
或者更好地使用
grepl
,因为它返回布尔向量

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

使用
invert
value
参数的
grep
简明版本

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

@Ronak给出的答案似乎比我的好,但是一个选项是使用
sapply
with
grepl
获取与
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
这也应该起作用:

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

我同意阿克伦的观点。这是非常有用的,但在这种情况下,我更喜欢grepl解决方案,因为我的向量没有那么长。