首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从字符串向量中删除包含R中特定字符的条目

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

Stack Overflow用户
提问于 2016-11-30 18:03:20
回答 3查看 14.5K关注 0票数 12

我有两个字符向量:

代码语言:javascript
复制
x = {"a", "b", "c", "kt"}
y = {"abs", "kot", "ccf", "okt", "kk", "y"}

我需要使用x从y中删除条目,以便只保留不包含x的任何条目的字符串,如下所示:

代码语言:javascript
复制
y = {"kot", "kk", "y"}

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

到目前为止,我已经尝试使用gsub和grepl,但它们只适用于单个字符串。我试图创建一个循环来做这件事,但这个问题似乎比我想象的要困难得多。当然,解决方案越复杂越好,但你可以假设在这种情况下,向量x和y最多有200个条目。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-11-30 18:10:20

我们可以使用grep找出y中的哪些值与x中的模式匹配,并使用!%in%排除它们

代码语言:javascript
复制
y[!y %in% grep(paste0(x, collapse = "|"), y, value = T)]

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

或者使用grepl更好,因为它返回布尔向量

代码语言:javascript
复制
y[!grepl(paste0(x, collapse = "|"), y)]

使用invertvalue参数的grep的简明版本

代码语言:javascript
复制
grep(paste0(x, collapse = "|"), y, invert = TRUE, value = TRUE)
#[1] "kot" "kk"  "y"  
票数 20
EN

Stack Overflow用户

发布于 2016-11-30 18:13:28

@Ronak给出的答案看起来比我的答案更可取,但一种选择是使用sapplygrepl来获得与y的匹配矩阵,对于x中的每个条目,然后用另一个对apply的调用进行汇总。

代码语言:javascript
复制
> y[!apply(sapply(x, function(q) {grepl(q, y)}), 1, function(x) {sum(as.numeric(x)) > 0})]
[1] "kot" "kk"  "y"  

下面是我所说的匹配矩阵:

代码语言:javascript
复制
> 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
票数 4
EN

Stack Overflow用户

发布于 2016-11-30 18:49:57

这也应该是可行的:

代码语言:javascript
复制
y[Reduce("+", lapply(x, grepl, y, fixed=TRUE))==0]
# [1] "kot" "kk"  "y"  
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40885360

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档