R:通过双向'过滤矢量。部分匹配

时间:2018-04-24 03:04:07

标签: r

有两个载体

static propTypes = {
    title: PropTypes.string.isRequired,
    navigator: PropTypes.object.isRequired,
}

有没有办法通过双向'进行过滤?部分匹配(如果它们包含或包含在另一个向量中的任何元素中,则删除一个向量中的元素),以便结果是这两个向量:

x <- c("abc", "12")
y <- c("bc", "123", "nomatch")

要解释 - x的每个元素都是y的一个元素的子字符串或超字符串,因此x1为空。更新 - 子字符串与初始字符匹配是不够的 - 可以在匹配的字符串中的任何位置找到子字符串。上面的示例已更新以反映这一点。

3 个答案:

答案 0 :(得分:3)

我原本认为?pmatch可能很方便,但您的编辑说明您不仅仅想要匹配项目的开头。这是一个应该有效的功能:

remover <- function(x,y) {
    pmx <- sapply(x, grep, x=y)
    pmy <- sapply(y, grep, x=x)

    hit <- unlist(c(pmx,pmy))

    list(
        x[!(seq_along(x) %in% hit)],
        y[!(seq_along(y) %in% hit)]
    )
}

remover(x,y)
#[[1]]
#character(0)
#
#[[2]]
#[1] "nomatch"

当找不到匹配项时,它正确无效(感谢@Frank获取之前的错误):

remover("yo","nomatch")
#[[1]]
#[1] "yo"
# 
#[[2]]
#[1] "nomatch"

答案 1 :(得分:1)

我们可以做到以下几点:

# Return data.frame of matches of a in b
m <- function(a, b) {
    data.frame(sapply(a, function(w) grepl(w, b), simplify = F));
}

# Match x and y and remove
x0 <- x[!apply(m(x, y), 2, any)]
y0 <- y[!apply(m(x, y), 1, any)]

# Match y and x and remove
x1 <- x0[!apply(m(y0, x0), 1, any)]
y1 <- y0[!apply(m(y0, x0), 2, any)]

x1;
#character(0)

x2;
#[1] "nomatch"

答案 2 :(得分:1)

我在两个方向上构建了一个包含所有可能匹配项的矩阵,然后将|与任意方向的匹配结合起来同样匹配,然后将其用于子集x和{{ 1}}:

y