如何确定向量是否包含另一个遵循R中顺序的向量?

时间:2018-04-23 18:33:55

标签: r

如果我有这样的载体:

vec1 <- c("a", "b", "c")
vec2 <- c("a", "b", "c", "d", "e")

我可以用

vec1 %in% vec2
TRUE TRUE TRUE

确定vec1中是否包含vec1。但是,我需要尊重相对顺序,而这种方法不会:

vec3 <- c("e", "d", "c", "b", "a") 
vec 1 %in% vec3 #should return false because not in abc order
TRUE TRUE TRUE

如何确定一个向量是否包含在另一个向量中,且两个向量中的相对相对顺序是否相同?谢谢!

编辑:向量是字符向量,但可能包含我关心的元素之间的其他元素。例如,我希望以下内容返回TRUE:

vec1 <- c("a", "b", "c")
vec4 <- c("a", "x", "b", "c", "y")

2 个答案:

答案 0 :(得分:3)

您可以将矢量折叠为正则表达式模式并使用grepl

vec1 <- c("a", "b", "c")
vec2 <- c("a", "b", "c", "d", "e")
grepl(paste(vec1, collapse=".*"), paste(vec2, collapse=""))
# TRUE
vec3 <- c("e", "d", "c", "b", "a")
grepl(paste(vec1, collapse=".*"), paste(vec3, collapse=""))
# FALSE
vec4 <- c("a", "x", "b", "c", "y")
grepl(paste(vec1, collapse=".*"), paste(vec4, collapse=""))
# TRUE

编辑:根据G5W的评论,您可以添加分隔符,以防每个元素不是一个字符,但可能是一个短字符串。分隔符将分解向量的条目

vec5 <- c("a", "b", "c")
vec6 <- c("ab", "c")
vec7 <- c("ab", "e", "c", "d")
grepl(paste(vec5, collapse="-.*"), paste(vec7, collapse="-"))
# FALSE
grepl(paste(vec6, collapse="-.*"), paste(vec7, collapse="-"))
# TRUE

答案 1 :(得分:1)

match函数返回另一个向量中的一个向量的排序。然后,当且仅当您寻求的“相对顺序”存在时,该结果的顺序差异将是严格正的。

all(vec1 %in% vec4) & all(diff(match(vec1, vec4)) >0 )
[1] TRUE
# also passes the additonal tests
 all(vec5 %in% vec7) & all(diff(match(vec5, vec7)) >0 )
#[1] FALSE
 all(vec6 %in% vec7) & all(diff(match(vec6, vec7)) >0 )
#[1] TRUE