我有一个字符向量。每个元素都包含多个I|J|K|...
类型的值,其中I, J, K
可能会有所不同,并且是其他字符,长度未定义。
我有两个值,current
和next
,我需要找到向量的元素,最后一个管道之后的最后一个值等于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
值也可以。
问题
有没有办法用单行写这个?还是用更简单的东西?
答案 0 :(得分:3)
我们可以使用grepl
的正则表达式:
pattern = paste0(currentValue, "\\|", nextValue, "$")
myVector[grepl(pattern, myVector)]
# [1] "f|c|v"
我们构建模式"c\\|v$"
(使用c
和v
的变量。 $
匹配字符串的结尾,确保匹配是最后一个和倒数第二个值。我们需要使用两个反斜杠来转义管道|
,否则它是正则表达式运算符。
请注意,如果值可能包含其他特殊正则表达式字符. \ | ( ) [ { ^ $ * + ?
,则还需要对其进行转义。
不需要分割或循环。