基于逻辑向量子索引匹配的R-strsplit与滤波

基于逻辑向量子索引匹配的R-strsplit与滤波,r,strsplit,R,Strsplit,我想以这样一种方式应用strsplit,即如果存在一对与&(例如,这是一对与&(NINA&SAM))和|(例如,这是另一对,但与|(NINA&SAM))相同的值,则保留一对& 下面是两种可能的情况,这些向量(vec1,vec2)的长度可能因实际情况而异 案例1 > vec1 [1] "((PAUL & SAM) | (PAUL | SAM) | (NINA & SAM) | (NINA | SAM) | (NINA & PAUL) | (NINA | PAUL))"

我想以这样一种方式应用strsplit,即如果存在一对与&(例如,这是一对与&
(NINA&SAM)
)和|(例如,这是另一对,但与|
(NINA&SAM)
)相同的值,则保留一对&

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

案例1

> 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))"
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
[1] "((PAUL | SAM) | (PAUL & SAM) | (!NINA & SAM) | (!NINA & PAUL))"
> vec2
[1] "((PAUL | SAM) & (PAUL & SAM) & (!NINA & SAM) & (!NINA & PAUL))"
> vec1
[1] "((PAUL & SAM) | (!NINA & SAM) | (!NINA & PAUL))"
> vec2
[1] "((PAUL & SAM) & (!NINA & SAM) & (!NINA & PAUL))"
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))"
这应该是输出:

案例1

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

> vec1
[1] "((PAUL | SAM) | (PAUL & SAM) | (!NINA & SAM) | (!NINA & PAUL))"
> vec2
[1] "((PAUL | SAM) & (PAUL & SAM) & (!NINA & SAM) & (!NINA & PAUL))"
> vec1
[1] "((PAUL & SAM) | (!NINA & SAM) | (!NINA & PAUL))"
> vec2
[1] "((PAUL & SAM) & (!NINA & SAM) & (!NINA & PAUL))"
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))"
到目前为止,我所尝试的:


我的想法是首先从向量的开头和结尾删除
,然后在“
)|”(
)上拆分vec1,在“
)&(
)上拆分vec2。然后进一步拆分
space*space
上的索引,检查子索引1和2是否与任何其他子索引匹配,如果是,则保留具有
的子索引。然后将所有内容放回一起。我对R的知识有限,无法实现我的想法。我相信,任何帮助都将不胜感激!

以下内容符合您的要求。
它不是很漂亮,但输出是正确的

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
}

keepAmpersand我相信以下内容符合您的要求。
它不是很漂亮,但输出是正确的

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
}

keepampers非常感谢您抽出时间来帮助我。最终输出缺少括号之间的链接,例如
(PAUL&SAM)“(!NINA&SAM)”
应该是
(PAUL&SAM)|“(!NINA&SAM)”
对于案例2
vec1
。其次,额外的开始和结束括号也丢失了。请您对代码进行注释,以便我能够轻松理解每一行都在做什么。再次非常感谢!@Newbie查看是否是这样。请注意,它只是
(PAUL&SAM)|(!NINA&SAM)
无需在条形码附近加引号。感谢您的帮助。有一点是,当括号中只有一个名称时,它不起作用,例如,
“((PAUL | SAM)&(PAUL&SAM)&(NINA | SAM)&(NINA | PAUL)&(NINA&PAUL)&(NINA))”
在这种情况下,它不会报告最后一个
(NINA)
。很抱歉,我没有在输入数据样本中设置这样的约束,但实际上我确实有这样的输入。如果我给您带来不便,我很抱歉,但在案例3
(尼娜•萨姆)
已退出,但最初不应退出。因为没有其他索引包含这些名称。请您解释一下。谢谢!非常感谢您抽出时间来帮助我。最终输出缺少括号之间的链接,例如,
(PAUL&SAM)“(!NINA&SAM)”
应该是
(PAUL&SAM);“(!NINA&SAM)”
对于案例2
vec1
。其次,额外的开始和结束括号也丢失了。请您对代码进行注释,以便我能够轻松理解每一行都在做什么。再次非常感谢!@Newbie查看是否是这样。请注意,它只是
(PAUL&SAM)|(!NINA&SAM)
无需在条形码附近加引号。感谢您的帮助。有一点是,当括号中只有一个名称时,它不起作用,例如,
“((PAUL | SAM)&(PAUL&SAM)&(NINA | SAM)&(NINA | PAUL)&(NINA&PAUL)&(NINA))”
在这种情况下,它不会报告最后一个
(NINA)
。很抱歉,我没有在输入数据样本中设置这样的约束,但实际上我确实有这样的输入。如果给您带来不便,我很抱歉,但是在案例3中
(NINA | SAM)
被删除了,但它本来不应该被删除。因为没有其他索引包含这些名称。请您解释一下。谢谢!