R:在向量中查找满足两个条件的元素

时间:2018-04-17 14:41:55

标签: r vector conditional

我有一个字符向量。每个元素都包含多个I|J|K|...类型的值,其中I, J, K可能会有所不同,并且是其他字符,长度未定义。

我有两个值,currentnext,我需要找到向量的元素,最后一个管道之后的最后一个值等于next,并且倒数第二个为current

我有以下示例工作,但它不优雅也不快。

library(stringr)

myVector <- c("a|b|c", "f|o|o", "b|a|r", "f|c|v")
currentValue <- "c"
nextValue <- "v"

for(values in myVector) {
    #Split it
    split <- strsplit(values, split = "|", fixed = TRUE)[[1]]

    # If the penultimate is equal to current
    if(split[length(split)-1] == currentValue & 
       # And the last one is equal to next
       split[length(split)] == nextValue) {

        # DO SOMETHING
        print(values)

    }
} 

示例返回正确:[1] "f|c|v"。它可以在这里测试:http://rextester.com/DVD4647

编辑:可能与要求不匹配(else的{​​{1}}是什么。在这种情况下,if值也可以。

问题

有没有办法用单行写这个?还是用更简单的东西?

1 个答案:

答案 0 :(得分:3)

我们可以使用grepl的正则表达式:

pattern = paste0(currentValue, "\\|", nextValue, "$")
myVector[grepl(pattern, myVector)]
# [1] "f|c|v"

我们构建模式"c\\|v$"(使用cv的变量。 $匹配字符串的结尾,确保匹配是最后一个和倒数第二个值。我们需要使用两个反斜杠来转义管道|,否则它是正则表达式运算符。

请注意,如果值可能包含其他特殊正则表达式字符. \ | ( ) [ { ^ $ * + ?,则还需要对其进行转义。

不需要分割或循环。