R strsplit和基于逻辑向量中的子索引匹配的过滤

时间:2018-04-27 08:39:32

标签: r strsplit

我想以这样一种方式应用strsplit:如果存在一对相同的值和& (例如,这是一对& SELECT ( ( ( x - 1 ) / 10 ) + 1 ) * 10 )以及| (例如,这是另一对,但使用| (NINA & SAM)),然后使用&

保留一对

下面是两种可能的情况,这些矢量(vec1,vec2)的长度可能因实际情况而异。

案例1

(NINA | SAM)

案例2

> vec1
[1] "((PAUL & SAM) | (PAUL | SAM) | (NINA & SAM) | (NINA | SAM) | (NINA & PAUL) | (NINA | PAUL))"
> vec2
[1] "((PAUL | SAM) & (PAUL & SAM) & (NINA | SAM) & (NINA | PAUL) & (NINA & PAUL) & (NINA & SAM))"

这应该是输出:

案例1

> vec1
[1] "((PAUL | SAM) | (PAUL & SAM) | (!NINA & SAM) | (!NINA & PAUL))"
> vec2
[1] "((PAUL | SAM) & (PAUL & SAM) & (!NINA & SAM) & (!NINA & PAUL))"

案例2

> vec1
[1] "((PAUL & SAM) | (NINA & SAM) | (NINA & PAUL))"
> vec2
[1] "((PAUL & SAM) & (NINA & PAUL) & (NINA & SAM))"

到目前为止我尝试过:

我的想法是首先从向量的开头和结尾移除> vec1 [1] "((PAUL & SAM) | (!NINA & SAM) | (!NINA & PAUL))" > vec2 [1] "((PAUL & SAM) & (!NINA & SAM) & (!NINA & PAUL))" ((,然后将vec1拆分为“))”并将vec2拆分为“) | ( “。然后进一步拆分) & (上的索引并检查子索引1和2是否与任何其他子索引匹配,如果是,则保留具有space*space的索引。然后把所有东西放回原处。我对R的了解有限,我无法实现我的想法。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:2)

我相信以下是你想要的 它不是很漂亮,但输出是正确的。

keepAmpersand <- function(x) {
    y <- sub("\\(\\(", "(", x)  # get rid of the double
    y <- sub("\\)\\)", ")", y)  # parenthesis
    # this regex is meant to replace either a '|' or a '&'

    # with the same character between '#' (one '#' on each side)  
    y <- gsub("(\\) \\| \\(|\\) & \\()", ")#\\1#(", y)

    # now use that special pattern, '# five chars #' to split
    y <- unlist(strsplit(y, "#.{5}#"))

    # keep the ones with the ampersand or with just one name
    y <- grep("&|\\([[:alpha:]]+\\)", y, value = TRUE)
    y <- paste0("(", paste(y, collapse = " | "), ")")    # reassemble
    y
}

现在将该功能应用于每个案例。

案例1

vec1 <-
"((PAUL & SAM) | (PAUL | SAM) | (NINA & SAM) | (NINA | SAM) | (NINA & PAUL) | (NINA | PAUL))"
vec2 <-
"((PAUL | SAM) & (PAUL & SAM) & (NINA | SAM) & (NINA | PAUL) & (NINA & PAUL) & (NINA & SAM))"


keepAmpersand(vec1)
#[1] "((PAUL & SAM) | (NINA & SAM) | (NINA & PAUL))"

keepAmpersand(vec2)
#[1] "((PAUL & SAM) | (NINA & PAUL) | (NINA & SAM))"

案例2

vec1 <-
"((PAUL | SAM) | (PAUL & SAM) | (!NINA & SAM) | (!NINA & PAUL))"
vec2 <- 
"((PAUL | SAM) & (PAUL & SAM) & (!NINA & SAM) & (!NINA & PAUL))"


keepAmpersand(vec1)
#[1] "((PAUL & SAM) | (!NINA & SAM) | (!NINA & PAUL))"

keepAmpersand(vec2)
#[1] "((PAUL & SAM) | (!NINA & SAM) | (!NINA & PAUL))"

案例3:括号之间只有一个名称的情况。

vec3 <-
"((PAUL | SAM) & (PAUL & SAM) & (NINA | SAM) & (NINA | PAUL) & (NINA & PAUL) & (NINA))"

keepAmpersand(vec3)
#[1] "((PAUL & SAM) | (NINA & PAUL) | (NINA))"