从包含 R 中特定字符的字符串向量中删除条目
Remove entries from string vector containing specific characters in R
我有两个字符向量:
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
更好,因为它 returns 布尔向量
y[!grepl(paste0(x, collapse = "|"), y)]
grep
使用 invert
和 value
参数的简洁版本
grep(paste0(x, collapse = "|"), y, invert = TRUE, value = TRUE)
#[1] "kot" "kk" "y"
@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
这也应该有效:
y[Reduce("+", lapply(x, grepl, y, fixed=TRUE))==0]
# [1] "kot" "kk" "y"
我有两个字符向量:
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
更好,因为它 returns 布尔向量
y[!grepl(paste0(x, collapse = "|"), y)]
grep
使用 invert
和 value
参数的简洁版本
grep(paste0(x, collapse = "|"), y, invert = TRUE, value = TRUE)
#[1] "kot" "kk" "y"
@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
这也应该有效:
y[Reduce("+", lapply(x, grepl, y, fixed=TRUE))==0]
# [1] "kot" "kk" "y"