我想以这样一种方式应用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的了解有限,我无法实现我的想法。任何帮助将不胜感激!
答案 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))"