从包含 R 中特定字符的字符串向量中删除条目 [重复]
Posted
技术标签:
【中文标题】从包含 R 中特定字符的字符串向量中删除条目 [重复]【英文标题】:Remove entries from string vector containing specific characters in R [duplicate] 【发布时间】:2017-04-14 14:22:24 【问题描述】:我有两个字符向量:
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 个条目。
【问题讨论】:
【参考方案1】:我们可以使用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)]
使用invert
和value
参数的grep
的简洁版本
grep(paste0(x, collapse = "|"), y, invert = TRUE, value = TRUE)
#[1] "kot" "kk" "y"
【讨论】:
【参考方案2】:@Ronak 给出的答案看起来比我的要好,但一种选择是使用 sapply
和 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
【讨论】:
我同意 akrun。这很有帮助,但在这种情况下,我更喜欢 grepl 解决方案,因为我的向量不是那么长。【参考方案3】:这也应该有效:
y[Reduce("+", lapply(x, grepl, y, fixed=TRUE))==0]
# [1] "kot" "kk" "y"
【讨论】:
以上是关于从包含 R 中特定字符的字符串向量中删除条目 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
Hibernate Envers:如何从我的审计表中删除条目?
R语言unlist函数将复杂数据(list列表dataframe字符串String)对象处理成简单向量vector形式:将包含dataframe和字符串的向量列表转换为单个向量(删除数据名称)