基于逻辑向量子索引匹配的R-strsplit与滤波
我想以这样一种方式应用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))"
(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)”
对于案例2vec1
。其次,额外的开始和结束括号也丢失了。请您对代码进行注释,以便我能够轻松理解每一行都在做什么。再次非常感谢!@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)”
对于案例2vec1
。其次,额外的开始和结束括号也丢失了。请您对代码进行注释,以便我能够轻松理解每一行都在做什么。再次非常感谢!@Newbie查看是否是这样。请注意,它只是(PAUL&SAM)|(!NINA&SAM)
无需在条形码附近加引号。感谢您的帮助。有一点是,当括号中只有一个名称时,它不起作用,例如,“((PAUL | SAM)&(PAUL&SAM)&(NINA | SAM)&(NINA | PAUL)&(NINA&PAUL)&(NINA))”
在这种情况下,它不会报告最后一个(NINA)
。很抱歉,我没有在输入数据样本中设置这样的约束,但实际上我确实有这样的输入。如果给您带来不便,我很抱歉,但是在案例3中(NINA | SAM)
被删除了,但它本来不应该被删除。因为没有其他索引包含这些名称。请您解释一下。谢谢!